【问题标题】:how to deal with missings when importing csv to postgres?将csv导入postgres时如何处理丢失?
【发布时间】:2014-10-19 13:49:10
【问题描述】:

我想导入一个 csv 文件,该文件有多个缺失值。我将它们重新编码为 NULL 并尝试将文件导入为。我想我的包含 NULLS 的属性是字符值。但是将它们转换为数字有点复杂。因此,我想将我的所有表格导入为:

\copy player_allstar FROM '/Users/Desktop/Rdaten/Data/player_allstar.csv'  DELIMITER ';' CSV WITH NULL AS 'NULL' ';'  HEADER

一定有语法错误。但我尝试了不同的组合并且总是得到:

ERROR:  syntax error at or near "WITH NULL"
LINE 1: COPY  player_allstar FROM STDIN DELIMITER ';' CSV WITH NULL ...

我也试过了:

\copy player_allstar FROM '/Users/Desktop/Rdaten/Data/player_allstar.csv' WITH(FORMAT CSV, DELIMITER ';', NULL  'NULL', HEADER);

然后得到:

 ERROR:  invalid input syntax for integer: "NULL"
 CONTEXT:  COPY player_allstar, line 2, column dreb: "NULL"

我想这是由 R 预处理引起的。表格带有 NA,所以我将它们更改为:

  data[data==NA] <- "NULL"

我不知道转换为 NULL 的不同方式。我认为这会导致字符串。是否有不同的方法来预处理和保留 NA(当然在 postgres 中为 NULLS)?

示例:

              pts   dreb    oreb    reb asts    stl
              11    NULL    NULL     8   3      NULL
               4     5       3       8   2        1
               3    NULL    NULL     1   1      NULL

数据类型为整数

【问题讨论】:

  • 我认为您的第二次尝试非常接近,但您需要FORMAT CSV 而不仅仅是CSV。不添加作为答案,因为我是从记忆中说的......
  • 谢谢。我调整了我,但仍然得到错误:错误:整数的无效输入语法:“NULL”上下文:复制 player_allstar,第 2 行,列 dreb:“NULL”
  • 在默认设置下,NULL 被写为不带引号的空字符串。是否可以使用空字符串记录您的空值?如果没有,您能否给我们一份您的 csv 文件样本?
  • 请显示输入的示例行。
  • 感谢您的 cmets。我在上面添加了一些信息。

标签: postgresql csv


【解决方案1】:

给定/tmp/sample.csv

pts;dreb;oreb;reb;asts;stl
11;NULL;NULL;8;3;NULL
4;5;3;8;2;1
3;NULL;NULL;1;1;NULL

然后使用如下表格:

CREATE TABLE player_allstar (pts integer, dreb integer, oreb integer, reb integer, asts integer, stl integer);

它对我有用:

\copy player_allstar FROM '/tmp/sample.csv' WITH (FORMAT CSV, DELIMITER ';', NULL 'NULL', HEADER);

【讨论】:

    【解决方案2】:

    您的语法很好,问题似乎在于您的数据格式。使用您的语法,我能够成功加载带有 NULL 的数据:

    mydb=# create table test(a int, b text);
    CREATE TABLE
    mydb=# \copy test from stdin WITH(FORMAT CSV, DELIMITER ';', NULL  'NULL', HEADER);
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> col a header;col b header
    >> 1;one
    >> NULL;NULL
    >> 3;NULL
    >> NULL;four
    >> \.
    mydb=# select * from test;
     a |  b
    ---+------
     1 | one
       |
     3 |
       | four
    (4 rows)
    
    mydb=# select * from test where a is null;
     a |  b
    ---+------
       |
       | four
    (2 rows)
    

    在您的情况下,如果原始值为 'NA',您可以在复制命令中替换为 NULL 'NA'。

    您应该确保数据值周围没有空格。例如,如果您的 NULL 在数据中表示为 NA,并且字段用分号分隔:

    1;NA <-- good
    1 ; NA <-- bad
    1<tab>NA <-- bad
    

    等等

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多