8

我想将 CSV 文件导入 9.2 版,但 CSV 文件在最后一列位置有双引号双引号来表示 NULL 值:

"2","1001","9","2","0","0","130","","2012-10-22 09:33:07.073000000",""

它映射到时间戳类型的列。postgreSQL 不喜欢“”。我试图设置 NULL 选项,但也许我做得不对?我已经尝试过NULL as '""并且NULL ''NULL as ''NULL ""没有成功;这是我的命令:

COPY SCH.DEPTS 
FROM 'H:/backups/DEPTS.csv' 
WITH (
 FORMAT CSV,
 DELIMITER ',' ,
 NULL  '',
 HEADER TRUE,
 QUOTE   '"' 
 )

但它失败并出现错误:

错误:类型时间戳的无效输入语法:“”

上下文:复制部门,第 2 行,列过期日期:“”

PS 有没有办法为 COPY 命令指定布尔值的字符串表示形式?生成 CSV(其中有很多)的实用程序使用“false”和“true”。

4

2 回答 2

9

空字符串 ("") 不是有效的时间戳,并且COPY似乎不提供FORCE NULLorFORCE EMPTY TO NULL模式;它有相反的,FORCE NOT NULL,但这不会做你想要的。

您可能需要COPY将数据放入带有text时间戳字段的表中,可能是一个UNLOGGEDTEMPORARY表,然后使用INSERT INTO real_table SELECT col1, col, col3, NULLIF(tscol,'') FROM temp_table;.

COPY应该接受truefalse作为布尔值,所以你不应该有任何问题。

或者,使用简单的 Python 脚本和csv模块读取 CSV,然后使用psycopg2toCOPY行进入 Pg。或者只是写出新清理的 CSV 并将其输入COPY. 或者使用进行数据转换的 ETL 工具,例如 Pentaho Kettle 或 Talend。

于 2013-01-25T08:42:36.537 回答
2

5年后,这似乎仍然是一个问题。我今天在运行 PostgreSQL 9.6.8 时遇到了这个问题。作为运行 COPY 命令之前的一种解决方法,我使用sed替换所有出现的""withnull然后添加NULL as 'null'到我的 COPY 命令中,即

sed -i 's/""/null/g' myfile.csv

PGPASSWORD=<pwd> psql -h <host> -p <port> -d <db> -U <user>
-c "\copy mytable from myfile.csv WITH CSV DELIMITER ',' QUOTE '\"' ESCAPE '\\' NULL as 'null';"
于 2018-11-29T13:10:36.430 回答