Running COPY
results in ERROR: invalid input syntax for integer: ""
error message for me. What am I missing?
My /tmp/people.csv
file:
"age","first_name","last_name"
"23","Ivan","Poupkine"
"","Eugene","Pirogov"
My /tmp/csv_test.sql
file:
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;
Output:
$ 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
Trivia:
- PostgreSQL 9.2.4
There is a way to solve "", the quoted null string as null in integer column, use FORCE_NULL option :
see postgresql document, https://www.postgresql.org/docs/current/static/sql-copy.html
Ended up doing this using
csvfix
:In case you know for sure which columns were meant to be
integer
orfloat
, you can specify just them:Without specifying the exact columns, one may experience an obvious side-effect, where a blank string will be turned into a string with a
0
character."first_name","age","last_name" Ivan,23,Poupkine Eugene,,Pirogov
copy people from
'file.csv'
with (delimiter ';', null '');Just in first column.....
""
isn't a valid integer. PostgreSQL accepts unquoted blank fields as null by default in CSV, but""
would be like writing:and fail for the same reason.
If you want to deal with CSV that has things like quoted empty strings for null integers, you'll need to feed it to PostgreSQL via a pre-processor that can neaten it up a bit. PostgreSQL's CSV input doesn't understand all the weird and wonderful possible abuses of CSV.
Options include:
csv
module, PerlText::CSV
, etc to pre-process it;I think it's better to change your csv file like:
It's also possible to define your table like
and after copy, you can convert empty strings:
this ought to work without you modifying the source csv file: