PG COPY error: неверный синтаксис ввода для integer

под управлением COPY результаты ERROR: invalid input syntax for integer: "" сообщение об ошибке для меня. Что я упускаю?

мой :

"age","first_name","last_name"
"23","Ivan","Poupkine"
"","Eugene","Pirogov"

мой :

CREATE TABLE people (
  age        integer,
  first_name varchar(20),
  last_name  varchar(20)
);

COPY people
FROM '/tmp/people.csv'
WITH (
  FORMAT CSV,
  HEADER true,
  NULL ''
);

DROP TABLE people;

выход:

$ psql postgres -f /tmp/sql_test.sql
CREATE TABLE
psql:sql_test.sql:13: ERROR:  invalid input syntax for integer: ""
CONTEXT:  COPY people, line 3, column age: ""
DROP TABLE

Общая информация:

7 ответов


ошибка: неверный входной синтаксис для integer: ""

"" не является допустимым числом. В PostgreSQL можно без кавычек пустые поля как null по умолчанию в CSV, но "" было бы похоже на написание:

SELECT ''::integer;

и не по той же причине.

если вы хотите иметь дело с CSV, который имеет такие вещи, как цитируемые пустые строки для целых чисел null, вам нужно будет передать его PostgreSQL через предпроцессор, который может немного его подправить. CSV-вход PostgreSQL не понимает всех странных и замечательных возможных злоупотреблений CSV.

варианты:

  • загрузка его в электронную таблицу и экспорт вменяемого CSV;
  • использование Python csv модуль для Perl Text::CSV и т. д. Для предварительной обработки;
  • использование Perl / Python / whatever для загрузки CSV и вставки его непосредственно в DB
  • используя инструмент ETL, как CloverETL, Talend Studio, или Pentaho чайник

Я думаю, что лучше изменить csv-файл, например:

"age","first_name","last_name"
23,Ivan,Poupkine
,Eugene,Pirogov

также можно определить вашу таблицу как

CREATE TABLE people (
  age        varchar(20),
  first_name varchar(20),
  last_name  varchar(20)
);

и после копирования, вы можете обменять пустые строки:

select nullif(age, '')::int as age, first_name, last_name
from people

у меня была такая же ошибка на postgres с COPY утверждение, но мой файл tab-разделены вместо запятую и в кавычках.

моя ошибка заключалась в том, что я охотно копировал/вставлял содержимое файла из github, но в этом процессе все вкладки были преобразованы в пробелы, следовательно, ошибка. Мне пришлось загрузить и сохранить raw-файл, чтобы получить хорошую копию.


в конечном итоге это делается с помощью csvfix:

csvfix map -fv '' -tv '0' /tmp/people.csv > /tmp/people_fixed.csv

в случае, если вы точно знаете, какие столбцы должны быть integer или float, вы можете указать только их:

csvfix map -f 1 -fv '' -tv '0' /tmp/people.csv > /tmp/people_fixed.csv

без указания точных столбцов может возникнуть очевидный побочный эффект, когда пустая строка будет превращена в строку с 0 символ.


это должно работать без изменения исходного csv-файла:

alter table people alter column age type text;
copy people from '/tmp/people.csv' with csv;

Я получил эту ошибку при загрузке " / "разделенного CSV-файла, хотя в моем входном файле не было символов"". Оказалось, что я забыл указать формат:

копировать ... ОТ... С (ФОРМАТ CSV, разделитель '|').


есть способ решить"", цитируемую нулевую строку как null в целочисленном столбце, используйте параметр FORCE_NULL:

\copy table_name FROM 'file.csv' with (FORMAT CSV, FORCE_NULL(column_name));

см. документ postgresql,https://www.postgresql.org/docs/current/static/sql-copy.html