我正在处理包含以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
或外部程序,我想提高效率。
答案 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
命令),在每个子文件上并行运行转换步骤,并尽快导入每个转换后的片断,以缩短总执行时间。