postgres csv date null导入错误

时间:2016-11-04 17:18:55

标签: postgresql csv import

我正在将数据导入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:""

这可能很简单,但我在网上找到的解决方案都没有用。

4 个答案:

答案 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)。