将0x00视为NULL

时间:2017-05-23 13:55:44

标签: postgresql file null

我有一个包含大量音乐数据的大文件(超过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或者让我可以导入这个文件的其他解决方案?

2 个答案:

答案 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。这很有效。

''