我有一个包含大量音乐数据的大文件(超过1GB),我想使用COPY命令读取此文件。这是一张大桌子。有很多曲目。
但是,在第372032行,有一些曲目没有类型,而是一个0x00字符。经过一些谷歌搜索后,我发现0x00字符是一个NULL符号,但是postgresql在阅读时遇到了问题。
我想要的是postgresql将0x00视为NULL。查看postgresql documentation for COPY,并看到copy命令有一个选项,用于将特定字符串读取为NULL。我试过这个,但是无法通过添加选项NULL'\ 0x00'来获得它(我也试过'\ x00','0x00','x00')。我认为这是因为postgresql首先希望能够在它可以替换之前阅读。
我运行了以下脚本
COPY music
FROM 'mw_spotify_labels.csv'
WITH DELIMITER ' '
NULL '\0x00'
encoding 'latin1';
这给了我以下错误消息
ERROR: invalid byte sequence for encoding "LATIN1": 0x00
CONTEXT: COPY music, line 372032
********** Error **********
ERROR: invalid byte sequence for encoding "LATIN1": 0x00
SQL state: 22021
Context: COPY music, line 372032
我尝试使用一些不同的编码(不起作用)。我也试过FART用空格替换0x00,但我找不到定义0x00的好方法。
有没有人知道如何让NULL工作,用''设置替换0x00或者让我可以导入这个文件的其他解决方案?
答案 0 :(得分:0)
如果违规列仅包含COPY music
FROM 'mw_spotify_labels.csv'
WITH DELIMITER ' '
NULL '''\0x00'''
encoding 'latin1';
(包括单引号),则可以使用
0x00
如果{
"_id" : "10",
"members" : [
"10",
"20",
"30"
],
"moderators" : [
"50",
"60",
"70"
]
}
出现在文本中间某处,则必须以某种方式进行过滤。
答案 1 :(得分:0)
按Vim编辑文件,并将所有for(int k = 0; k < x[0].length; k++)
替换为\0x00
。这很有效。
''