2017-05-23 40 views
0

我有一个包含大量音乐数据的大文件(超过1GB),并且我想使用COPY命令读取此文件。这是一张大桌子。有很多曲目。将0x00视为NULL

但是,在第372032行有几条曲目没有流派,而是一个0x00字符。一些谷歌搜索后,我发现0x00字符是一个NULL符号,但postgresql有读取这个问题。

我想要的是postgresql将0x00视为NULL。看着postgresql documentation for 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

据我所知,CSV格式在内部不支持NULL,所以0x00字符肯定是无效的。我会用\ N或或其他一些占位符替换所有的0x00字符。目前的问题不在执行查询或正确处理空值 - PostgreSQL基本上无法读取和解析损坏的CSV文件。 –

+0

可能你应该尝试另一种编码,如'psql =#copy tmp from'/path/to/file.csv'with delimiter','csv header encoding'windows-1251';' –

回答

0

如果违规列中只包含'\0x00'(包括单引号),你可以使用

COPY music 
FROM 'mw_spotify_labels.csv' 
WITH DELIMITER ' ' 
NULL '''\0x00''' 
encoding 'latin1'; 

如果0x00某处出现在文本的中间,你必须过滤器是莫名其妙。