作者shala (沙罗)
看板EZsoft
标题[请问] 有高效率将大量中文字串转成HEX的软
时间Wed Jan 16 14:42:26 2019
我有一些文字档,里面都是中文字
每个档案大约都有100万行
想要把内容全部转成UNICODE的HEX
例如「中」变成「4E2D」
这个转换不困难,但行数高达100万行左右
是否有每个档案能在10秒内完成转换的高效率程式?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 173.213.89.40
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/EZsoft/M.1547620949.A.DC5.html
1F:→ spfy: 10s连档案都还没读完吧?01/16 15:19
10s太难的话就改30s吧。希望能尽量快。
2F:→ kobe8112: 转换完放在RAM跟还要存到硬碟内也不一样01/16 15:34
是要存在硬碟
3F:→ kobe8112: 不对啊,你文字档原始的编码格式是啥?01/16 15:45
原始编码为UNICODE
4F:推 enthos: www.di-mgt.com.au/hexdump-for-windows.html01/16 15:56
试用後觉得不合用。减为20万行还是花了以分钟计算的时间
※ 编辑: shala (173.213.89.40), 01/16/2019 16:58:52
5F:→ kobe8112: 你是要给人看而不是程式要使用的话,01/16 17:09
6F:→ kobe8112: notepad++就有HEX-EDITOR这个外挂模组了,或者使用01/16 17:10
7F:→ kobe8112: UltraEdit这类编辑器01/16 17:11
8F:→ kobe8112: 应该说所有文字编辑器,支援HEX MODE都可以用01/16 17:12
谢谢,不过转换的目的不是要看,而是要给其他程式使用
※ 编辑: shala (173.213.89.40), 01/16/2019 17:18:47
9F:→ kobe8112: 给其他程式用,不需要转啊,程式只要可以读档案,直接开01/16 17:28
10F:→ kobe8112: 档起来不就是你要的答案了?QQ01/16 17:29
说起来有点复杂,总之是需要转换这一个步骤的。我也希望能省略这一步,但目前还解决
不了QQ
※ 编辑: shala (173.213.89.40), 01/16/2019 18:46:56
11F:推 rick65134: 感觉就是其他程式不是原PO开发的 且只吃HEX01/16 19:12
12F:→ rick65134: 自己写程式最快啦 这麽单一又大量的功能 值得写程式01/16 19:13
我有列入未来计画
13F:→ kobe8112: 还是不太了解,我从文意推测你是用Windows,假设今天你01/16 19:40
14F:→ kobe8112: 开了一个记事本,输入「中」後存档,编码选unicode,01/16 19:41
15F:→ kobe8112: 实际储存的资料就是4Bytes: 0xFF 0xFE 0x2D 0x4E01/16 19:42
16F:→ kobe8112: 那你希望的这个程式,转换完以後档案的raw data是啥呢?01/16 19:42
17F:→ kobe8112: Hex: FF FE 34 00 45 00 32 00 44 00 共10Bytes?01/16 19:45
简单说就是转换後的文字档打开是显示4E2D这个字串。我要把这个字串拿去喂其他程式
※ 编辑: shala (173.213.89.40), 01/16/2019 20:15:42
18F:→ rick65134: 每行100中文字 一百万行 python3.7+ramdisk 40秒01/16 20:14
谢谢参考数据,硬碟确实是一个关卡QQ
※ 编辑: shala (173.213.89.40), 01/16/2019 20:18:33
19F:→ kobe8112: 所以4E2D存档要用什麽编码?一样Windows上所谓的unicode 01/16 20:32
20F:→ kobe8112: (UCS-2-LE)吗?还是需要再转其他编码?这会影响速度 01/16 20:33
21F:→ kobe8112: 能不能传个范例档来测试测试XD01/16 20:50
转换後的档案我还是用同一种编码,档案略大一点,但就图个方便。
范例档...其实用字典生成就很类似了。我的档案会有一些大五码以外的中文字。
22F:推 rick65134: 你有python3吗?01/16 21:15
有
23F:→ kobe8112: 扣除BOM,档案大小应该会变4倍01/16 21:32
哈哈,我改用UTF-8试试看好了
24F:→ kobe8112: 所以你要喂的那个程式,确定可以吃多种编码格式? 01/16 23:28
其实不行,所以真的很想换掉那个程式QQ
25F:→ kobe8112: 你的需求,转换後若用UTF-8,撇开Windows会加BOM来看, 01/16 23:28
26F:→ kobe8112: 跟用ASCII编码是一样的大小,也与来源档大小相同 01/16 23:30
27F:→ xvid: 未实测速度 Akelpad + HexSel plugin 01/17 10:41
28F:→ xvid: 刚实测一下有点lag 01/17 10:46
我再找更好的硬体run看看
29F:推 netio: 试下我写的 测试30MB文字档(Unicode)不含读写约1秒左右01/17 20:18
31F:→ netio: 在命令列模式下使用 01/17 20:20
感谢,效率提升很有感!是否因为演算法有所改良?
若「不转换」断行符号会影响效率吗?因为转换後的档案仍需保持行数不变。
32F:→ kobe8112: 你同一个档案编码方式不一致,软体根本无从判断啊01/18 09:07
33F:推 netio: 用查表法应该是最快了 事先会吃1G的记忆体 理论上可支持01/18 11:55
35F:→ netio: 断行符号会影响一点点效率 01/18 11:57
感谢!断行符号不太影响效率的话,可否开发一个保持断行的版本?
另外我发现您的程式会将字串两两对调,
以UTF-8的「一二」为例,
转换前的HEX:E4 B8 80 E4 BA 8C
转换後的字串:B8 E4 E4 80 8C BA
能改为以原顺序输出吗?
36F:→ kobe8112: Mapping table只需要一个型别uint16_t 大小256的阵列吧?01/18 12:52
37F:→ kobe8112: 然後前面讲错,依原PO需求的UCS-2转UTF-8大小变2倍才对 01/18 12:53
感谢!
能否再增加不转换断行符号的选项?困难的话我自己再加工替换
39F:推 rick65134: 效率提升的问题应该是因为python本身就不是让你拚速度01/18 16:24
40F:→ kobe8112: UTF-8没有BE LE的区别耶... 01/18 17:05
41F:推 netio: 内定就是不转换了 还是你要多个选项?不支持Utf8喔 01/18 17:42
原来如此,我以为也支援UTF8。那没问题了,非常感谢!
※ 编辑: shala (45.56.160.202), 01/18/2019 19:55:44
42F:推 Bencrie: 你是要存成 source code 喔?vim 的 xxd -i 01/20 23:39