linux - 使用linux或python删除特殊字符

标签 linux postgresql csv unicode character-encoding

我正在将以下格式的 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/

相关文章:

sql - 如何计算 varchar 字段中的每个字符?

ruby - 有没有一种更简洁的方法使用 podio gem 在 Ruby 中将 xlsx 对象转换为 csv

linux - 为什么添加新用户后,无密码 ssh 不起作用

python - 在 Python 中传递带空格的命令行参数

linux - 在 pydev eclipse (Debian) 中配置 kivy 路径

java - Java 程序如何在 Linux 上列出所有分区并获取它们的可用空间?

python - 使用 pytest-django 对现有数据库运行测试

python - 如何在sql查询odoo中使用变量

python - 添加 future 日期以绘制趋势线

linux - 在 Linux 中,是否有将 CSV 文件转换为 SQLite 文件的命令?