Ошибка при импорте данных из csv в sql

Встала задача перенести данный из csv в sql. Я использую postgresql и соответсвенно все действия проходят в pgadmin. Всё делал от графического интерфейса. Создал столбцы, начал импорт, и вылезла ошибка -

ОШИБКА: нет данных для столбца "first_name"
CONTEXT: COPY yandex, строка 728: ""

Проблема заключается в том, что дальше занесение не идёт и null не ставится. Я пробовал сделать так, что бы при пустом поле ставился null, но не получилось. Файл слишком большой что бы перебирать его вручную и искать ошибки. Можно как то сделать исключение этой строки или как это исправить? Вот пример данных из csv файла -

phone_number;first_name;full_name;email;address_city,address_street,address_house,address_entrance
+78129..;ООО Т.;;;город,улица ,21,
+79000...;Наталья;Фио;почта;город,улица,13/2,6

Ответы (2 шт):

Автор решения: Andrey Tabakov

Скорее всего, у вас в таблице, куда вы загружаете, выставлены ограничения (constraints) на колонки. Они не позволяют вам вставлять пустые значения.

Как вариант, вы можете создать временную таблицу без каких либо правил, загрузить CSV туда, а потом уже с помощью SQL вставить в их в нужном вам виде:

CREATE TABLE my_temp_table (
    phone_number TEXT,
    first_name TEXT,
    full_name TEXT,
    email TEXT,
    address TEXT
);

COPY my_temp_table FROM 'путь/к/файлу.csv' WITH (FORMAT CSV, DELIMITER ';', HEADER, NULL ''); -- Здесь NULL заменится на '', но более сложные случаи это не решит

INSERT INTO my_prod_table (
    phone_number, first_name, full_name, email, address
)
SELECT 
    phone_number,
    upper(first_name), -- приведите данные в тот вид, который необходим схеме, куда вы вставляете. Функция upper используется для примера
    full_name, 
    email,
    address
FROM my_temp_table; 

DROP TABLE my_temp_table;
→ Ссылка
Автор решения: Solt

Всё правильно, делаете таблицу с текстовыми полями, позволяющими null и даже можно со значениями по умолчанию пустые строки.

Однако, что-то у вас с CSV. Половина полей через ';', а дальше через ','. Так нельзя, либо одно, либо другое. Пусть файл и большой, но можно каким-нибудь sed из командной строки пройтись и заменить все запятые на точку с запятой, или наоборот. А потом каким-нибудь grep или тем же sed проверить, чтоб все строки содержали одинаковое кол-во разделителей. Да даже обычный Notepad++ чуть ли не гиговый файл открыть может, там замену и сделать.

Предварительная подготовка данных может оказаться значительно дешевле, чем дальнейшее шаманство с перекладыванием кусков текста из одних полей в другие.

→ Ссылка