将csv导入postgres时如何处理丢失?

时间:2014-10-19 13:49:11

标签: postgresql csv

我想导入一个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"

我不知道chaning to NULL的另一种方式。我认为这会导致字符串。有没有不同的方法来预处理和保留NA(当然,作为NULLS在postgres中)?

样品:

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

数据类型是整数

2 个答案:

答案 0 :(得分:2)

鉴于/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);

答案 1 :(得分:1)

您的语法很好,问题似乎在于数据的格式化。使用您的语法,我能够成功加载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