我有一个包含大量音乐数据的大文件(超过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与''或其他解决方案,使我可以导入此文件?
据我所知,CSV格式在内部不支持NULL,所以0x00字符肯定是无效的。我会用\ N或或其他一些占位符替换所有的0x00字符。目前的问题不在执行查询或正确处理空值 - PostgreSQL基本上无法读取和解析损坏的CSV文件。 –
可能你应该尝试另一种编码,如'psql =#copy tmp from'/path/to/file.csv'with delimiter','csv header encoding'windows-1251';' –