我正在尝试使用COPY将CSV文件导入到PostgreSQL中。当它命中有空值的行时,它会阻塞,例如下面的第二行:
JAN-01-2001,1,2,3,4,5
01-02-2001,6,7,,,
我已经尝试了这个COPY语句,以及使用NULL和引号的变体,但都没有找到任何有效的方法。
使用分隔符',‘CSV从'data.dat’复制数据;
有什么建议吗?数据文件是在一个巨大的22 it的平面文件中,所以我想避免直接编辑它。
发布于 2011-12-03 07:47:35
为了便于导入,我建议将数值列转换为文本列。原因是空字符串不是有效的数值。将数值列更改为文本列,导入CSV文件,将空值更新为null或0,然后将列更改回整数。
发布于 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
操作,修复有问题的值,然后插入到目标表中,从文本转换。请参见:
发布于 2016-12-06 11:49:23
这是PostgreSQL错误- csv解析器忽略最后一个空项并抛出错误- "PG::BadCopyFileFormat: ERROR: missing data for column“。
我用了一个愚蠢的黑客:
如果最后一项为空,只需在字符串末尾添加一个分隔符:
1,2,3
1,2,,
这将添加行中缺少的最后一项以导入数据。
https://stackoverflow.com/questions/8347237
复制相似问题