将十六进制表示形式转换为unicode

时间:2018-12-27 00:20:32

标签: unix sed unicode utf-8

我正在处理包含以Unicode的ascii表示形式的单词的大文件(〜10Gb):

Nuray \u00d6zdemir
Erol \u010colakovi\u0107 \u0160ehi\u0107

在将它们插入数据库之前,我想将它们转换为unicode,如下所示:

Nuray Özdemir
Erol Čolaković Šehić

我已经看过to do it with vim的用法,但是对于非常大的文件来说速度很慢。我以为可以复制/粘贴正则表达式,但不能。

我实际上得到了这样的东西:

$ echo "Nuray \u00d6zdemir" | sed -E 's/\\\u(.)(.)(.)(.)/\x\1\x\2\x\3\x\4/g'
Nuray x0x0xdx6zdemir

如何连接\x\1 \2的值...?

由于文件的大小,我不想使用echo或外部程序,我想提高效率。

2 个答案:

答案 0 :(得分:2)

假设文件中的unicode在BMP(16位)之内,该怎么做:

perl -pe 'BEGIN {binmode(STDOUT, ":utf8")} s/\\u([0-9a-fA-F]{4})/chr(hex($1))/ge' input_file > output_file

输出:

Nuray Özdemir
Erol Čolaković Šehić

我已生成一个6Gb文件来测试速度效率。 花了大约。 10分钟即可在我6岁的笔记本电脑上处理整个文件。 希望您会接受。

答案 1 :(得分:1)

我根本不是mongoDB专家,但我可以告诉您以下内容:

如果有一种方法可以直接在数据库引擎中进行导入,则现在应使用此解决方案,如果此功能不可用。

您可以使用幼稚的方法来解决它:

while read -r line; do echo -e "$line"; done < input_file

输入:

cat input_file
Nuray \u00d6zdemir
Erol \u010colakovi\u0107 \u0160ehi\u0107

输出:

Nuray Özdemir
Erol Čolaković Šehić

但是,正如您发现的那样,在每一行上对echo -e的调用都将创建上下文的资源密集型更改(为echo->内存分配生成一个子流程,在流程中添加新条目表,优先级管理,切换回父进程),对于10GB的文件而言效率不高。

或者使用发行示例中应提供的工具寻求更智能的方法:

whatis ascii2uni 
ascii2uni (1)        - convert 7-bit ASCII representations to UTF-8 Unicode

命令:

ascii2uni -a U -q input_file 
Nuray Özdemir
Erol Čolaković ᘎhić

您还可以将输入文件分割(例如,split命令),在每个子文件上并行运行转换步骤,并尽快导入每个转换后的片断,以缩短总执行时间。