Копия PostgreSQL из CSV с отсутствующими значениями данных - PullRequest
19 голосов
/ 01 декабря 2011

Я пытаюсь импортировать файл CSV в PostgreSQL, используя COPY. Он задыхается, когда попадает в строку, где есть пустые значения, например, второй ряд ниже:

JAN-01-2001,1,2,3,4,5

JAN-02-2001,6,7 ,,,

Я пробовал это утверждение COPY, а также варианты, использующие NULL и QUOTE, и не нашел ничего, что работает.

КОПИРОВАНИЕ данных ИЗ 'data.dat' ИСПОЛЬЗОВАНИЕ РАЗДЕЛИТЕЛЕЙ ',' CSV;

Есть предложения? Файл данных находится в массивном плоском файле размером 22 ГБ, поэтому я не хочу редактировать его напрямую.

Ответы [ 5 ]

1 голос
/ 03 декабря 2011

Ваше утверждение подозрительно:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

DELIMITERS использовался в версиях до 7.3 . Это все еще поддерживается, чтобы не сломать старый код, но не использовать его больше. Правильное ключевое слово - DELIMITER. И вам вообще не нужно указывать ,, так как это значение по умолчанию для FORMAT CSV.
Также я цитирую руководство здесь :

имя файла

Абсолютный путь входного или выходного файла. Пользователям Windows может потребоваться использовать строку E'' и удвоить все обратные слеши, используемые в имени пути.

Смелый акцент мой. Замените 'data.dat' на что-то вроде '/path/to/data.dat' в UNIX или E'C:\\path\\to\\data.dat' в Windows.

Для версий 7.3+ используйте:

COPY data FROM '/path/to/data.dat' CSV

Для версий 9.0+ используйте:

COPY data FROM '/path/to/data.dat' (FORMAT CSV)

Если вы все еще получаете эту ошибку:

ERROR: invalid input syntax for type numeric:
CONTEXT: COPY data, line 13, column interval_2400:

Тогда, очевидно, исходный файл не соответствует структуре таблицы data. Посмотрите на ваш исходный файл, перейдите к строке 13 и посмотрите, какое значение есть для столбца interval_2400. Скорее всего, это не числовой. В частности, empty string ('') не допускается в столбцах числового типа.

Вы можете исправить исходный файл или адаптировать определение таблицы :

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;

Или любой другой тип, более подходящий. Может быть interval, судя по названию. (Но text принимает почти любые входные значения.)

Или, что еще лучше, создайте измененный временный файл, COPY к нему, исправьте ошибочные значения, затем вставьте в целевую таблицу, преобразуя ее из текста. См:

1 голос
/ 03 декабря 2011

Я бы предложил преобразовать ваши числовые столбцы в текстовые столбцы для целей вашего импорта.Причина в том, что пустая строка не является допустимым числовым значением.Измените числовые столбцы на текстовые столбцы, импортируйте файл CSV, обновите пустые значения до нуля или 0, а затем измените столбец на целое число.

0 голосов
/ 11 февраля 2017

Еще одно предупреждение: проверьте номер строки ошибки и убедитесь, что она не является пустой строкой в ​​файле CSV.Это заставит postgres выдавать ту же ошибку об отсутствующих значениях.

0 голосов
/ 06 декабря 2016

Это ошибка PostgreSQL - парсер csv игнорирует последний пустой элемент и выдает ошибку - «PG :: BadCopyFileFormat: ОШИБКА: отсутствуют данные для столбца».

Я использую глупый хак:

Если последний элемент пуст, просто добавьте один разделитель в конец строки:

1,2,3
1,2,,

Это добавление пропущенного последнего элемента в строке для импорта данных.

0 голосов
/ 05 ноября 2015

Любой, кто приходит сюда с меньшими файлами: вот самое простое исправление, которое я нашел, и непоследовательное количество разделителей в CSV.

  1. Откройте CSV.
  2. Ctrl + Shift + 8 (выбирает все данные)
  3. Ctrl + h (открывает найти заменить)
  4. Оставьте поле поиска пустым, чтобы он искал строки 0 длины.
  5. Введите пробел в поле для замены.

Это будет циклически проходить через весь CSV и заставлять его иметь правильное количество столбцов в разделителях (,), даже если в этом столбце нет данных.

Если вы в порядке с Excel, вы можете также превратить это в макрос, так что мой макрос (Ctrl + g) делает это за один раз. Создание макроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...