|
|
任性的枇杷 · 交通 - 广州市人民政府门户网站· 6 月前 · |
|
|
强悍的长颈鹿 · 华北电力大学电气与电子工程学院· 8 月前 · |
|
|
近视的火龙果 · ApiController クラス ...· 9 月前 · |
|
|
彷徨的绿茶 · Your request has been ...· 9 月前 · |
|
|
爱吹牛的香烟 · MATLAB生成M序列和Gold序列_m序列 ...· 11 月前 · |
我正在尝试使用COPY将CSV文件导入到PostgreSQL中。当它命中有空值的行时,它会阻塞,例如下面的第二行:
JAN-01-2001,1,2,3,4,5
01-02-2001,6,7,,,
我已经尝试了这个COPY语句,以及使用NULL和引号的变体,但都没有找到任何有效的方法。
使用分隔符',‘CSV从'data.dat’复制数据;
有什么建议吗?数据文件是在一个巨大的22 it的平面文件中,所以我想避免直接编辑它。
为了便于导入,我建议将数值列转换为文本列。原因是空字符串不是有效的数值。将数值列更改为文本列,导入CSV文件,将空值更新为null或0,然后将列更改回整数。
你的陈述是可疑的:
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
操作,修复有问题的值,然后插入到目标表中,从文本转换。请参见:
任何带着小文件来这里的人:这是我找到的解决csv中分隔符数量不一致问题的最简单的方法。
这将循环遍历整个CSV,并强制它在分隔符(,)中使用正确的列数,即使该列中没有数据。
如果你对Excel没有意见,你也可以把它转换成宏,所以我的宏(Ctrl + g)可以一下子做到这一点。 Creating a Macro
这是PostgreSQL错误- csv解析器忽略最后一个空项并抛出错误- "PG::BadCopyFileFormat: ERROR: missing data for column“。
我用了一个愚蠢的黑客:
如果最后一项为空,只需在字符串末尾添加一个分隔符:
1,2,3
1,2,,
这将添加行中缺少的最后一项以导入数据。
一个额外的警告-检查错误的行号,并确保它不是CSV文件中的空行。这将导致postgres抛出关于缺失值的相同错误。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券