首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从缺少数据值的CSV进行PostgreSQL拷贝

从缺少数据值的CSV进行PostgreSQL拷贝
EN

Stack Overflow用户
提问于 2011-12-02 03:36:55
回答 5查看 27.1K关注 0票数 22

我正在尝试使用COPY将CSV文件导入到PostgreSQL中。当它命中有空值的行时,它会阻塞,例如下面的第二行:

JAN-01-2001,1,2,3,4,5

01-02-2001,6,7,,,

我已经尝试了这个COPY语句,以及使用NULL和引号的变体,但都没有找到任何有效的方法。

使用分隔符',‘CSV从'data.dat’复制数据;

有什么建议吗?数据文件是在一个巨大的22 it的平面文件中,所以我想避免直接编辑它。

EN

回答 5

Stack Overflow用户

发布于 2011-12-03 07:47:35

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

票数 1
EN

Stack Overflow用户

发布于 2011-12-03 07:57:33

你的陈述是可疑的:

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

DELIMITERS在7.3之前的版本中使用。为了不破坏旧代码,它仍然被支持,但是不要再使用它了。正确的关键字是DELIMITER。而且您根本不需要指定,,因为它是FORMAT CSV的默认设置。

另外,我引用manual here

文件名

输入或输出文件的绝对路径名。Windows用户可能需要使用E''字符串和路径名中使用的所有反斜杠。

大胆强调我的观点。在UNIX上用'/path/to/data.dat'替换'data.dat',在Windows上用E'C:\\path\\to\\data.dat'替换。

对于7.3+版本,请使用:

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

对于9.0+版本,请使用:

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

如果仍然出现此错误:

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

那么,很明显,源文件与表data的结构不匹配。看一下源文件,转到第13行,看看列interval_2400的值是什么。很有可能,它不是数字。特别是,在数值类型的列中不允许使用empty string ('')。

您可以修改源文件,也可以调整表定义

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;

或者任何更合适的类型。从名字来看可能是interval。(但text几乎接受所有输入值。)

或者,更好的方法是,创建一个修改过的临时文件,对其执行COPY操作,修复有问题的值,然后插入到目标表中,从文本转换。请参见:

票数 1
EN

Stack Overflow用户

发布于 2016-12-06 11:49:23

这是PostgreSQL错误- csv解析器忽略最后一个空项并抛出错误- "PG::BadCopyFileFormat: ERROR: missing data for column“。

我用了一个愚蠢的黑客:

如果最后一项为空,只需在字符串末尾添加一个分隔符:

1,2,3
1,2,,

这将添加行中缺少的最后一项以导入数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8347237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档