【问题标题】:Include NULL values when copying csv using psql使用 psql 复制 csv 时包含 NULL 值
【发布时间】:2016-12-23 05:11:59
【问题描述】:

我有一个包含各种数据格式的 csv,我试图将其复制到 postgres。我每次都遇到这个错误,因为在第 97789 行我有几列带有空单元格。

我不想删除这一行(以及其他可能包含 NULL 值的行),而是想找到一种解决方案,将它们包含在数据库中。列ma effective date 应该采用整数值。但是当我尝试使用以下代码时 - 它不起作用,可能是因为我试图将 NULL 作为字符串输入:

oakland=# \copy test_import FROM '/Users/Downloads/IE670_test.csv' DELIMITER ','  NULL AS 'NULL' csv
ERROR:  invalid input syntax for integer: "        "
CONTEXT:  COPY test_import, line 97789, column ma effective date (ccyymmdd): "        "

但是,切换到NULL as NULL 也不起作用,并在psql 中产生语法错误。无论列中的数据类型如何,是否有有效的解决方案来包含 NULL 值?

这是原始格式的违规行:

048A706200600,48A-7062-6     ,17,3,5815,PRESLEY WAY                                       ,          ,OAKLAND                       ,94618,    ," $102,150.00 "," $38,259.00 ", $-   , $-   , $-   , $-   , $-   ," $7,000.00 ", $-   ," $133,409.00 ",2015,139807,20150527,20150901, ,                    ,                                                  ,                                                            ,          ,                              ,     ,    ,  , ,        , ,1100,Single family residential homes used as such

【问题讨论】:

  • 整行?违规单元格的内容是“”我猜。
  • 不确定如何使用包含的逗号分隔符来做到这一点。我有大约 40 列,正在使用 Open Office
  • 一个csv文件可以在任何文本编辑器中打开
  • 完成,我编辑了问题
  • 好吧,您的 CSV 文件中没有 null!你所拥有的是一堆空格,ERROR: invalid input syntax for integer: " " 突然开始变得有意义

标签: sql postgresql csv psql


【解决方案1】:

如果空值单元格确实为空,则省略NULL AS 'NULL' 子句。否则(似乎是这种情况),将'NULL' string 替换为包含这些单元格中的任何内容的字符串。您可能需要确保 csv 中的 null 值是一致的。

test.csv(一个空格):

1, ,3

SQL

create table csv (one int, two int, three int);

一个空格为空:

\copy csv from '~/test.csv' delimiter ',' null as ' ' csv;
COPY 1

两个空格为空:

\copy csv from '~/test.csv' delimiter ',' null as '  ' csv;
ERROR:  invalid input syntax for integer: " "
CONTEXT:  COPY csv, line 1, column two: " "

【讨论】:

  • 我添加了一个示例——看起来您的空单元格包含 8 个 个空格(可能是一个因粘贴而损坏的标签?),而不是一个,按照您的错误消息以上。
  • 令人困惑的部分是我在整个表格中有这么多空单元格,只是直到第 97789 行才出现在该特定列中。什么可能导致该特定列中的错误?还有许多其他的整数数据类型。
  • 显而易见的结论是第 97789 行是第一个将空单元格记录为整数字段的行,尽管如果不检查第 1-97788 行自然无法确认这一点。如果您有空单元格但它们要进入文本列,那很好;只有当它必须转换并且不能转换时,您才会看到错误。
  • 我们需要 devination 才能告诉您是什么导致了该特定行中的错误。您显然在不同的列中有不同数量的空格作为空。否则,此答案的改编将对您有用。您最好的选择是预处理您的 CSV 以将所有这些可变长度的空白转换为相同的空表示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2016-05-11
相关资源
最近更新 更多