PostgreSQL从CSV复制缺少数据值怎么处理?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

我试图使用COPY将CSV文件导入到PostgreSQL中。当它碰到有空值的行时会失效,例如下面的第二行:

JAN-01-2001,1,2,3,4,5 JAN-02-2001,6,7 ,,,

我试过这个COPY语句,以及使用NULL和QUOTE的变体,并没有找到任何可行的方法。

COPY data from'data.dat'USING DELIMITERS','CSV;

有什么建议么?数据文件位于一个巨大的22GB平面文件中,因此我想避免直接编辑它。

提问于
用户回答回答于

有了这样的问题,你应该始终包含有关你的操作系统PostgreSQL版本号的信息

你的陈述是可疑的:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

DELIMITERS在7.3之前的版本中使用。为了不破坏旧代码,仍然支持它,但不再使用它。正确的关键字是DELIMITER。而且你不需要指定,,因为它是默认值FORMAT CSV。 另外,我在这里引用手册

文件名 输入或输出文件的绝对路径名称。Windows用户可能需要使用E字符串,并加上路径名中使用的任何反斜杠。

所以,你'data.dat'应该像'/path/to/data.dat'在UNIX或E'C:\\path\\to\\data.dat'Windows上一样。

对于版本7.3+使用:

COPY data FROM '/path/to/data.dat' CSV

对于9.0+版本的使用:

COPY data FROM '/path/to/data.dat' (FORMAT CSV)

如果你仍然得到这个错误:

错误:数字类型的输入语法无效:CONTEXT:COPY数据,第13行,列interval_2400:

然后,显然,源文件与表的结构不匹配data。看看你的源文件,到第13行,看看列有什么值interval_2400。它不是数字。你可以修复源文件修改表格定义

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;

或者哪种类型更合适。可能是interval,从名字上判断。

用户回答回答于

我建议将数值列转换为文本列,以便进行导入。原因是空字符串不是有效的数值。将数值列更改为文本列,导入CSV文件,将空值更新为NULL或0,然后将该列更改为整数。

扫码关注云+社区