我正在将数据导入Postgres数据库。我导入的表包含几个带日期的列。
我上传的CSV文件的某些日期字段的值为空。
表格如下:
dot_number bigint,
legal_name character varying,
dba_name character varying,
carrier_operation character varying,
hm_flag character varying,
pc_flag character varying,
...
mcs150_date date,
mcs150_mileage bigint,
数据如下所示:
1000045,"GLENN M HINES","","C","N","N","317 BURNT BROW RD","HAMMOND","ME","04730","US","317 BURNT BROW RD","HAMMOND","ME","04730","US","(207) 532-4141","","","19-NOV-13","20000","2012","23-JAN-02","ME","1","2"
1000050,"ROGER L BUNCH","","C","N","N","108 ST CHARLES CT","GLASGOW","KY","42141","US","108 ST CHARLES CT","GLASGOW","KY","42141","US","(270) 651-3940","","","","72000","2001","23-JAN-02","KY","1","1"
我试过这样做:
COPY CC FROM 'C:\Users\Owner\Documents\FMCSA Data\FMCSA_CENSUS1_2016Sep.txt' DELIMITER ',' CSV HEADER NULL '';
但是我收到了这个错误:
错误:类型日期的输入语法无效:""背景:COPY cc,line 24,列mcs150_date:"" **********错误**********
错误:类型日期的输入语法无效:"" SQL状态:22007 上下文:COPY cc,第24行,列mcs150_date:""
这可能很简单,但我在网上找到的解决方案都没有用。
答案 0 :(得分:1)
您需要指定QUOTE
字符,以便将""
解释为NULL
,如下所示:
COPY CC FROM 'C:\Users\Owner\Documents\FMCSA Data\FMCSA_CENSUS1_2016Sep.txt' DELIMITER ',' CSV HEADER QUOTE '"' NULL '';
QUOTE '"'
是补充。
文档:https://www.postgresql.org/docs/current/static/sql-copy.html
答案 1 :(得分:0)
我最终导入为文本,然后根据正确的类型更改表格。
答案 2 :(得分:0)
仅供以后参考。
文档:https://www.postgresql.org/docs/current/sql-copy.html
说,
NULL
指定表示空值的字符串。默认值为\ N (反斜杠-N)为文本格式, CSV中未引用的空字符串 格式。您甚至可能希望使用文本格式的空字符串 您不想区分空字符串和空字符串的情况。 使用二进制格式时,不允许使用此选项。
因此请删除空字符串上的引号,以获取这些空日期值上的NULL值。
答案 3 :(得分:0)
仅供参考,此处的问题可能是 not-null 日期值的日期格式。保存到CSV的MS Excel文件通常使用01-JUL-16
格式,但是PostgreSQL不会知道如何处理它,除非您首先将其转换为标准日期格式之一[1]。但是PostgreSQL在进行COPY时将无法“开箱即用”接受该格式,因为它将显示一个日期字符串,该日期字符串与默认情况下可以处理的格式掩码之一不匹配。 / p>
那,并且对空日期值进行空处理。
[1](也许处理了提前两位数年份的后果,尤其是1969年之前的年份将被解释为20xx)。