我要将CSV文件导入9.2版,但CSV文件在最终列位置中具有双引号双引号以表示NULL值:
“2”,“1001”,“9”,“2”,“0”,“0”,“130”,“”,“2012-10-22 09:33:07.073000000” “”
,它映射到类型为Timestamp的列。 postgreSQL不喜欢“”。我试图设置NULL选项,但也许我不是做正确吗?我尝试了 NULL as'“和 NULL''和 NULL as' 和 NULL“”但未成功;这是我的命令:
COPY SCH.DEPTS
FROM'H:/backups/DEPTS.csv'
WITH(
FORMAT CSV,
DELIMITER',',
NULL'',
HEADER TRUE,
QUOTE'“'
)
,但失败并显示错误:
错误:类型为timestamp的输入语法无效:
CONTEXT:COPY depts,line 2,column expirydate:“”
PS有一种方法可以指定布尔值到COPY命令的字符串表示形式?生成CSV(其中有很多)的实用程序使用“false “和”true“。
空字符串(”“)不是有效的时间戳, COPY 似乎不提供 FORCE NULL 或 FORCE EMPTY TO NULL 模式;它有相反的, FORCE NOT NULL ,但这不会做你想要的。
可能需要将 COPY 数据导入具有文本字段的表格,可能是 UNLOGGED 或 TEMPORARY 表,然后使用 INSERT INTO real_table SELECT col1,col,col3,NULLIF(tscol, ')FROM temp_table; 。
COPY true 和 false 作为布尔值,因此您不应该有任何问题。
或者,使用简单的Python脚本和 csv 模块读取CSV,然后使用 psycopg2 到 COPY 行插入Pg。或者只需写入新的清理过的CSV并将其送入 COPY 。或使用执行数据变换(如Pentaho Kettle或Talend)的ETL工具。