V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Loki2015
V2EX  ›  Linux

大文件编码转换有什么工具?

  •  
  •   Loki2015 · 2016-05-29 23:31:21 +08:00 · 5559 次点击
    这是一个创建于 3106 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 enconv 处理一个几十个 G 的文件从 GB 转 UTF8 时出错,有什么其他比较不错的办法么?

    哦 当然我还知道用 UE ,有其他更适合的推荐么?

    20 条回复    2016-05-31 07:30:40 +08:00
    cxbig
        1
    cxbig  
       2016-05-29 23:35:55 +08:00   ❤️ 1
    没实际操作过,可以考虑按行分割文件,处理以后再合并。
    xupefei
        2
    xupefei  
       2016-05-29 23:41:20 +08:00   ❤️ 1
    自己写个程序,按行读取,按行写入新文件。
    Loki2015
        3
    Loki2015  
    OP
       2016-05-29 23:43:01 +08:00   ❤️ 1
    对 这也是个办法, 谢谢
    Loki2015
        4
    Loki2015  
    OP
       2016-05-29 23:43:52 +08:00   ❤️ 1
    @xupefei 这种程序网上多得是 我并不觉得会写的更好
    SoloCompany
        5
    SoloCompany  
       2016-05-29 23:55:36 +08:00   ❤️ 1
    不是 iconv 么?
    Loki2015
        6
    Loki2015  
    OP
       2016-05-30 00:00:29 +08:00   ❤️ 1
    iconv,enca(enconv 会根据当前系统编码猜测要转换的目标编码,省去了-x 选项),convmv
    之前找到的主流的几种吧 还有一些用 py 处理的
    Loki2015
        7
    Loki2015  
    OP
       2016-05-30 01:46:24 +08:00   ❤️ 1
    问题原因找到了, enca(也可以说是 iconv) 处理文件时如果遇到跟预期编码不同的字符串就会报异常,
    enca: Iconv conversion error on `/tmp/encaWaQKSu': Illegal byte sequence

    我的文件里包含英文、汉字、阿拉伯文、可能还有其他语言字符。当然中文是最多的,而且是 Win 下输出的文件,所以很多程序默认识别的编码都是 GB2312

    这导致程序按照 GBK 处理转换 UTF8 时出现该错误,因为它发现了不符合 GBK 编码的字符串。

    最后还是用 UE 打开了接近 100G 的文件,完美转换到 UTF8 ,花了大概几十分钟。
    fengyqf
        8
    fengyqf  
       2016-05-30 07:37:49 +08:00   ❤️ 1
    iconv 加 -c 参数
    clino
        9
    clino  
       2016-05-30 08:43:29 +08:00   ❤️ 1
    用 python 写几行代码,读文件一行行转,估计比 Ultraedit 快
    ue 指的是 ultraedit 没错吧?
    timeback
        10
    timeback  
       2016-05-30 09:59:32 +08:00   ❤️ 1
    @clino 同意啊,用 python 写几行就搞定了哒。
    likuku
        11
    likuku  
       2016-05-30 10:03:32 +08:00   ❤️ 1
    最近收到同事在 windows 下直接生成的 .txt 文件,已经是 GB18030 编码了...
    SpicyCat
        12
    SpicyCat  
       2016-05-30 10:10:15 +08:00   ❤️ 1
    楼主,就是说你的文件是混合编码?
    SpicyCat
        13
    SpicyCat  
       2016-05-30 10:10:42 +08:00   ❤️ 1
    @timeback
    @clino
    混合编码的话, python 也能处理吗?
    ashfinal
        14
    ashfinal  
       2016-05-30 10:22:53 +08:00   ❤️ 1
    iconv ?
    clino
        15
    clino  
       2016-05-30 10:41:46 +08:00   ❤️ 1
    @SpicyCat 混合编码的话,就写一个数组一个个试了,比如我以前写过的
    codecs_list = [
    "gbk",
    "gb18030",
    "gb2312",
    "utf8",
    "utf16"
    ]
    一个个试,如果成功就返回,如果有异常就继续试
    当然这种方法可能会有错误的情况发生,不过绝大部分情况是可以的
    murmur
        16
    murmur  
       2016-05-30 11:36:26 +08:00   ❤️ 1
    比起为什么出错 我想知道是什么奇葩设计把几十个 gb 编码不同的文本存储在一个文件里
    likuku
        17
    likuku  
       2016-05-30 20:11:52 +08:00
    @clino 这样也不见得行啊...也可能一行里混合几种编码(我就遇到过,试了很多办法,无解,放弃了).

    或许要逐字符进行编码判断转换,但这效率... python 是有第三方作的 编码判断模块...也就那样了。
    clino
        18
    clino  
       2016-05-30 20:37:40 +08:00
    @likuku 一行里混合几种编码这么 BT 那你还是放弃了吧 话说为什么有这种奇葩的情况呢...
    likuku
        19
    likuku  
       2016-05-30 23:27:39 +08:00
    @clino 那是个邮件相关信息的原始数据,而邮件可能千奇百怪的编码,得到的信息就可能一行记录信息混合多种编码。
    clino
        20
    clino  
       2016-05-31 07:30:40 +08:00
    @likuku 不理解,邮件里用什么编码都有标清楚的吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2637 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:43 · PVG 09:43 · LAX 17:43 · JFK 20:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.