我正在将以下格式的 csv 文件复制到 postgres 中:
0 "the"
1 "parative Philosophy 62 June 2007 pp 125130 More on Jonas and Process Philosophy in The Legacy of Hans Jonas Judaism and the Phenomenon of Life Edited by Havakp TiroschSamuelson"
将此 csv 文件复制到 postgres 时出现以下错误:
copy dict from '/home/r.csv' with delimiter E'\t';
ERROR: invalid byte sequence for encoding "UTF8": 0x00
我尝试使用“sed s/\/\g' ./r.csv ”删除特殊字符。但是,特殊字符不会被删除。有什么方法可以使用 linux 或 python 删除特殊字符
我的操作系统是 ubuntu 12.04 lts。
最佳答案
我敢打赌,问题在于该文件实际上是 UTF-16-LE,而不是 UTF-8。
一串 ASCII 字符,如 "abc"
,当编码为 UTF-16-LE 然后解码为 UTF-8 时,将类似于 "a\0b\0c\0"
,正是导致了这种错误。
但解决方案不是去掉 \0
nul 字节。只要您的数据都是 ASCII(或所有 ASCII 加上 Latin-1 的某个子集),这似乎就可以工作,但一旦它是其他任何东西,它就会给您带来垃圾或错误。例如,CJK 字符 U+5000 ('伥'
) 编码为 UTF-16-LE 然后解码为 UTF-8 看起来像 '\0P'
,而您当然不想去掉 nul 字节并将其转换为 'P'
。 (就此而言,您不想将 U+5050 '休'
解释为 'PP'
。)
正确的做法是重新编码文件。例如:
iconv -f UTF-16-LE -t UTF-8 r.csv >r8.csv
并非每个 iconv
安装都支持相同的名称,我不知道哪些名称是规范的。 iconv --list |grep -i utf
应该给你一个名称列表,并且应该很明显哪个是 UTF-16-LE 哪个是 UTF-8,所以你可以选择合适的。
当然不是每个系统都自带iconv
;您可能需要改用其他工具。如果最坏的情况发生,您总是可以用几行 Python 编写一个。
关于linux - 使用linux或python删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868933/