V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
linuxsteam
V2EX  ›  问与答

请问怎么对文本进行数据处理、挖掘?

  •  
  •   linuxsteam · 2018-07-16 09:32:36 +08:00 · 1547 次点击
    这是一个创建于 2321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    图 如图所示,我要在类似的数据上进行数据处理,剔除前面的 60832 列数据, 然后后面框中数据要切割三段进行收集(这个好处理,按长度切割就可以),但是后面的数据有的后面带空格(如箭头所示)。

    现在我的思路是按照数据位置切割(即利用 UltraEdit 的列模式进行区域选择) 但是文本文件数据很大,处理起来 这个不是上上策。。

    现在想用 ETL kettle 抽取(朋友推荐的),但是我从未使用过此软件,研究良久没有发现我想要的功能。虽然这个软件真的很强大。

    考虑过正则,但是数据并不是特别规则,我写不出来。

    总结起来问题就下面三点。

    1. 在没有太明确规则的数据中(但是宽度差不多相同,除了部分有空格的),怎么切割数据?
    2. 上述问题大家有没有类似的情况?
    3. 我是想入库的,最早是利用 navicat 导入向导操作的。但是效率不咋样,而且数据处理的也不完美。现在喜欢上了 kettle,不知道是否可以经过此软件达到我的目的? 图
    16 条回复    2018-07-19 18:50:31 +08:00
    noqwerty
        1
    noqwerty  
       2018-07-16 10:09:36 +08:00   ❤️ 1
    感觉两列之间空格数比较多?可以先正则"/\s{15,1000}/,/",然后把逗号作为分隔符分列后处理就行了,pandas 或者随便其他什么库应该都很方便。
    qinrui
        2
    qinrui  
       2018-07-16 10:16:04 +08:00 via iPhone
    awk 了解一下
    linuxsteam
        3
    linuxsteam  
    OP
       2018-07-16 10:33:32 +08:00
    @noqwerty 多谢开窍,我再研究研究怎么只替换空格 保留换行符
    noqwerty
        4
    noqwerty  
       2018-07-16 10:35:17 +08:00 via Android
    @linuxsteam 2 楼说的 awk 干这个应该很方便,但是我不会…… sed 应该也可以,总之能干活就行,多写几行少写几行的事。
    linuxsteam
        5
    linuxsteam  
    OP
       2018-07-16 10:50:37 +08:00
    @noqwerty 嘻嘻 我用 sublime 弄的, kettle 支持正则匹配 但是能不能处理 再研究,就是总多替换多一个空格很难受
    linuxsteam
        6
    linuxsteam  
    OP
       2018-07-16 10:51:02 +08:00
    多替换出来一个逗号,不是空格。。
    ynyounuo
        7
    ynyounuo  
       2018-07-16 10:56:59 +08:00 via iPhone
    按长度来,如果你用 Sublime Text 直接 Ctrl + Shift + L 不就好啦?
    iango
        8
    iango  
       2018-07-16 11:12:13 +08:00
    excel 分列?新版能处理 1048576 行。如果不会编程语言,感觉这个最简单了。
    如果用文本编辑器,正则最方便。
    dexterzzz
        9
    dexterzzz  
       2018-07-16 11:16:48 +08:00
    power query
    sunnyadamm
        10
    sunnyadamm  
       2018-07-16 12:00:41 +08:00
    awk,python,excel 等等,能处理的太多了,稍稍自己研究一下切割就 OK 了
    linuxsteam
        11
    linuxsteam  
    OP
       2018-07-16 12:15:29 +08:00
    @iango 我会点正则,数据分分钟超过 300w 行
    imn1
        12
    imn1  
       2018-07-16 13:01:51 +08:00
    300w,没哪个 GUI 能一次搞定,CLI 吧
    按行读取,分割字串,入库
    princelai
        13
    princelai  
       2018-07-16 13:02:17 +08:00
    ```
    cat tmp.txt
    60801 201805316549884131316646111
    60802 20180531564897132123131 11
    60803 20180531897611346504861 11
    60804 201805310021654812056115611
    ```


    ```
    cat tmp.txt | awk -F'\\s{5,}' '{print $2}'
    201805316549884131316646111
    20180531564897132123131 11
    20180531897611346504861 11
    201805310021654812056115611
    ```



    5 只要大于后面的空格数的任意数字就可以,python 就不给你谢了,反正都是正则表达式
    princelai
        14
    princelai  
       2018-07-16 13:25:32 +08:00   ❤️ 1
    没看清你是要再次分割后面,你试试下面这段

    ```
    cat tmp.txt | awk -v OFS='\t' -F'\\s{5,}' '{split($0,a)};{print substr(a[2],1,8),substr(a[2],9,10),substr(a[2],19,length(a[2]))}'
    20180531 6549884131 316646111
    20180531 5648971321 23131 11
    20180531 8976113465 04861 11
    20180531 0021654812 056115611
    ```
    x18960
        15
    x18960  
       2018-07-17 19:50:14 +08:00 via Android
    @princelai 谢谢大佬,请问 不想剔除换行符怎么做?\s 无差别替换啊
    princelai
        16
    princelai  
       2018-07-19 18:50:31 +08:00 via Android
    @x18960 根据图片里的内容,我觉得剔除换行可以工作啊,没见过你的数据我不好说怎么弄
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4866 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.