【问题标题】:postgres csv date null import errorpostgres csv日期空导入错误
【发布时间】:2017-03-18 15:02:15
【问题描述】:

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

但我收到此错误:

错误:日期类型的输入语法无效:“”上下文:复制抄送,行 24、列mcs150_date:“” **********错误**********

错误:日期类型的输入语法无效:“” SQL 状态:22007 上下文:COPY cc,第 24 行,mcs150_date 列:“”

这可能很简单,但是我在网上找到的所有解决方案都不起作用。

【问题讨论】:

  • 您的数据是什么样的?我认为它包含引号作为文本限定符,对吗?
  • 没错。这是第一条记录:1000004,"RAY TRUCKING LLC","A","N","N","WARWICK","GA","31796","US","01-JUL-16"," 83000","22-JAN-02","GA","1","1" mcs150_date 是最后一个日期字段。

标签: postgresql csv import


【解决方案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

【讨论】:

  • 谢谢。但我得到了同样的错误信息。也许桌子没有正确设置?我不确定。
  • 如果可能,更新您的帖子以包含您的表定义以及几行数据。
  • 我在上面加了。
【解决方案2】:

我最终导入为文本,然后根据正确的类型更改表格。

【讨论】:

    【解决方案3】:

    仅供将来参考。

    文档:https://www.postgresql.org/docs/current/sql-copy.html

    说,

    指定表示空值的字符串。默认为 \N (反斜杠-N) 文本格式,CSV 中不带引号的空字符串 格式。即使是文本格式,您也可能更喜欢空字符串 您不想将空值与空字符串区分开来的情况。 使用二进制格式时不允许使用此选项。

    所以删除空字符串上的引号以获得这些空日期值的 NULL 值。

    【讨论】:

      【解决方案4】:

      仅供参考,这里的问题可能是 not-null 日期值的日期格式。保存为 CSV 的 MS Excel 文件通常具有该格式 01-JUL-16,但 PostgreSQL 不知道如何处理它,除非您首先将其转换为标准日期格式之一[1]。但是 PostgreSQL 在执行 COPY 时将无法接受“开箱即用”的格式,因为它会显示一个与默认情况下可以处理的格式掩码之一不匹配的日期字符串。

      那个,以及对空日期值的空处理。

      [1] (并且可能处理了预先设置 2 位数年份的后果,特别是 1969 年之前的年份将被解释为 20xx)。

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 2022-07-01
        相关资源
        最近更新 更多