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
Общая информация:
- PostgreSQL 9.2.4
7 ответов
ошибка: неверный входной синтаксис для integer: ""
""
не является допустимым числом. В PostgreSQL можно без кавычек пустые поля как null по умолчанию в CSV, но ""
было бы похоже на написание:
SELECT ''::integer;
и не по той же причине.
если вы хотите иметь дело с CSV, который имеет такие вещи, как цитируемые пустые строки для целых чисел null, вам нужно будет передать его PostgreSQL через предпроцессор, который может немного его подправить. CSV-вход PostgreSQL не понимает всех странных и замечательных возможных злоупотреблений CSV.
варианты:
- загрузка его в электронную таблицу и экспорт вменяемого CSV;
- использование Python
csv
модуль для PerlText::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