gmi*_*ile 41 csv postgresql import copy
为我运行错误消息的COPY结果ERROR: invalid input syntax for integer: "".我错过了什么?
我的/tmp/people.csv档案:
"age","first_name","last_name"
"23","Ivan","Poupkine"
"","Eugene","Pirogov"
Run Code Online (Sandbox Code Playgroud)
我的/tmp/csv_test.sql档案:
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;
Run Code Online (Sandbox Code Playgroud)
输出:
$ 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
Run Code Online (Sandbox Code Playgroud)
琐事:
Cra*_*ger 25
错误:整数的输入语法无效:""
""不是有效的整数.默认情况下,PostgreSQL 在CSV中接受未加引号的空白字段为null,但""就像写:
SELECT ''::integer;
Run Code Online (Sandbox Code Playgroud)
并因同样的原因而失败.
如果你想处理像null整数的引用空字符串这样的CSV,你需要通过预处理器将它提供给PostgreSQL,它可以将它连接起来.PostgreSQL的CSV输入并不能理解CSV的所有奇怪和奇妙的滥用行为.
选项包括:
csv模块,Perl Text::CSV等对其进行预处理;小智 9
刚刚在寻找解决方案时遇到了这个问题,并想添加我能够通过将“null”参数添加到 copy_from 调用来解决该问题:
cur.copy_from(f, tablename, sep=',', null='')
Run Code Online (Sandbox Code Playgroud)
我认为最好更改你的csv文件,如:
"age","first_name","last_name"
23,Ivan,Poupkine
,Eugene,Pirogov
Run Code Online (Sandbox Code Playgroud)
也可以像你这样定义你的表
CREATE TABLE people (
age varchar(20),
first_name varchar(20),
last_name varchar(20)
);
Run Code Online (Sandbox Code Playgroud)
复制后,您可以转换空字符串:
select nullif(age, '')::int as age, first_name, last_name
from people
Run Code Online (Sandbox Code Playgroud)
小智 8
使用以下命令在一行中从 CSV 复制数据,而无需转换和更改数据类型。请将“NULL”替换为您的字符串,这会在复制数据中产生错误
copy table_name from 'path to csv file' (format csv, null "NULL", DELIMITER ',', HEADER);
Run Code Online (Sandbox Code Playgroud)
我在.sql带有COPY语句的postgres 文件中遇到了同样的错误,但我的文件是以制表符分隔而不是以逗号分隔和引用.
我的错误是我急切地从github复制/粘贴了文件内容,但是在那个过程中所有的标签都被转换为空格,因此出错了.我不得不下载并保存原始文件以获得良好的副本.
加载“ |”时出现此错误 分隔的CSV文件,尽管我的输入文件中没有'“'字符。结果我忘记指定FORMAT了:
COPY ... FROM ... WITH(FORFORM CSV,DELIMITER'|')。