使用任何建议的方法拆分文本

时间:2016-07-26 14:23:08

标签: sql split data-munging

我有一个这样的纯文本:

Cart ID: A3N42M / Copy: A3N42P PO: 5000021337 Invoice: 3110021337
Cart ID: A3N3ZW / Copy: A3N3ZX/ PO: 5000021335 Invoice: 3110021335 
Cart ID: A3N3ZL / Copy: A3N3ZM PO: 5000021336 Invoice: 3110021336 
Original: A3N444 / Copy: A3N445 PO: 5000021340 Invoice: 3130021340
Original: A3N44C / Copy: A3N44D PO: 5000021341 Invoice: 3130021341
Original: A3N44G / Copy: A3N44H PO: 5000021342 Invoice: 3130021342
Cart ID: A3N3ZZ / Copy: A3N428 PO: A3N3ZZ01
Cart ID: A3N3ZQ / Copy: A3N3ZV PO: A3N3ZQ01
Cart ID: A3N336 / Copy: A3N337 PO: A3N33601
E3M49D / E3M49Q - PO: 4620028049
E3M49N / E3M49X
E3M49P / E3M49Y

我需要从该文本中拆分购物车ID,最后是这样的:

A3N42M
A3N42P
A3N3ZW
...
E3M49N
...

这些ID始终为6位数字,始终以AEPAXXXXXEXXXXX,{{1}开头等等......)。

有没有办法(使用任何脚本或任何程序语言)我可以实现这个目标?

此纯文本目前位于电子表格表格中,我需要将这些ID分开,以便以后在SQL查询中使用,谢谢!

1 个答案:

答案 0 :(得分:1)

Regex Data-Munging

您可以通过regex替换(或查找和替换)执行此操作。我碰巧在python中这样做,但你可以在支持它们的任何语言或文本编辑器中使用相同的正则表达式模式('^[^/]*?: ''/.*')。

正则表达式解释

  1. '^[^/]*?: ' - 字符串的开头和开头(第一个^),以非贪婪的方式匹配多个非\字符([^/]*?]),{{1然后是:
  2. - 匹配所有'/.*',然后匹配多个任何字符(/
  3. 处理示例(在Python中)

    .
    import re
    
    text = '''
    Cart ID: A3N42M / Copy: A3N42P PO: 5000021337 Invoice: 3110021337
    Cart ID: A3N3ZW / Copy: A3N3ZX/ PO: 5000021335 Invoice: 3110021335 
    Cart ID: A3N3ZL / Copy: A3N3ZM PO: 5000021336 Invoice: 3110021336 
    Original: A3N444 / Copy: A3N445 PO: 5000021340 Invoice: 3130021340
    Original: A3N44C / Copy: A3N44D PO: 5000021341 Invoice: 3130021341
    Original: A3N44G / Copy: A3N44H PO: 5000021342 Invoice: 3130021342
    Cart ID: A3N3ZZ / Copy: A3N428 PO: A3N3ZZ01
    Cart ID: A3N3ZQ / Copy: A3N3ZV PO: A3N3ZQ01
    Cart ID: A3N336 / Copy: A3N337 PO: A3N33601
    E3M49D / E3M49Q - PO: 4620028049
    E3M49N / E3M49X
    E3M49P / E3M49Y
    '''
    
    text = re.sub('^[^/]*?: ([]*?)', '', text, flags=re.MULTILINE)
    text = re.sub('/.*', '', text)
    
    print text
    

    修改

    更新了正则表达式解释

    根据Guilherme De Mario的请求更新了A3N42M A3N3ZW A3N3ZL A3N444 A3N44C A3N44G A3N3ZZ A3N3ZQ A3N336 E3M49D E3M49N E3M49P

    1. 匹配任何字符(regex)(非贪婪),后跟一个字符类(.*?)的捕获组((...)),后跟至少一个字符类([AEP])后跟四个单词字符([0-9]+),后跟另一个任意字符的捕获组(\w{4}
    2. 所有这些都匹配并替换为捕获组变量,其间有一个换行符((.*)),实际上是拆分ID出现两次的行
    3. 仅使用第一个捕获组重复步骤以处理包含第二个ID
    4. 的换行符

      更新处理

      \1\n\2
      text = re.sub(r'.*?([AEP][0-9]+\w{4})(.*)', r'\1\n\2', text, flags=re.MULTILINE)
      text = re.sub(r'.*?([AEP][0-9]+\w{4}).*', r'\1', text, flags=re.MULTILINE)
      
      print text