Board logo

标题: [文本处理] 如何统计TXT文档中所有字母、数字和符号出现的次数 [打印本页]

作者: dragon631    时间: 2017-12-10 05:09     标题: 如何统计TXT文档中所有字母、数字和符号出现的次数

本帖最后由 dragon631 于 2017-12-10 05:11 编辑

“a.txt”文档中存入了如下内容:
UTL-17JFO-9840-UTL-17JFO-9841
UTL-17JFO-9841-UTL-17JFO-9842
UTL-17JFO-9842-UTL-17JFO-9843
UTL-17JFO-9843-UTL-17JFO-9844
UTL-17JFO-9843-UTL-17JFO-9845
UTL-17JFO-9844-UTL-17JFO-9845
UTL-17JFO-9845-UTL-17JFO-9846
UTL-17JFO-9846-UTL-17JFO-9847
UTL-17JFO-9847-UTL-17JFO-9848
UTL-17JFO-9848-UTL-17JFO-9849
UTL-17JFO-9849-UTL-17JFO-9850
UTL-17JFO-9850-UTL-17JFO-9851
UTL-17JFO-9851-UTL-17JFO-9852
UTL-17JFO-9852-UTL-17JFO-9853
UTL-17JFO-9853-UTL-17JFO-9854
UTL-17JFO-9854-UTL-17JFO-9855
UTL-17JFO-9855-UTL-17JFO-9856
UTL-17JFO-9856-UTL-17JFO-9857
UTL-17JFO-9857-UTL-17JFO-9858
UTL-17JFO-9858-UTL-17JFO-9859
UTL-17JFO-9859-UTL-17JFO-9860
UTL-17JFO-9860-UTL-17JFO-9861
UTL-17JFO-9861-UTL-17JFO-9862
UTL-17JFO-9862-UTL-17JFO-9863
UTL-17JFO-9863-UTL17-JFO-9864
UTL-17JFO-9863-UTL-17JFO-9864
UTL-17JFO-9864-UTL-17JFO-9865
UTL-17JFO-9865-UTL-17JFO-9866
UTL-17JFO-9866-UTL-17JFO-9867
UTL-17JFO-9866-UTL-17JFO-9967
UTL-17JFO-9867-UTL-17JFO-9868
UTL-17JFO-9868-UTL-17ODF-(1)17MX003
UTL-17ODF-(2-17MX003-UTL-17JFO-9869
UTL-17ODF-(2)17MX003-UTL-17JFO-9869
UTL-17JFO-9869-UTL-17JFO-9870
UTL-17JFO-9870-UTL-17JFO-9871
UTL-17JFO-9871-UTL-17JFO-9872
UTL-17JFO-9872-UTL-17JFO-9873
UTL-17JFO-9873-UTL-17JFO-9874
UTL-17JFO-9874-UTL-17JFO-9875
UTL-17JFO-9874-UTL-17JFO-9874
UTL-17JFO-9875-UTL-17JFO-9876
UTL-17JFO-9876-UTL-17JFO-9877
UTL-17JFO-9877-UTL-17JFO-9878
UTL-17JFO-9878-UTL-17JFO-9879
UTL-17JFO-9879-UTL-17JFO-9880
UTL-17JFO-9880-UTL-17JFO-9881
UTL-17JFO-9881-UTL-17JFO-9882
UTL-17JFO-9882-UTL-17JFO-9883
UTL-17JFO-9883-UTL-17JFO-9884
UTL-17JFO-9884-UTL-17JFO-9885
UTL-17JFO-9885-UTL-17JFO-9886
UTL-17JFO-9886-UTL-17JFO-9887
UTL-17JFO-9887-UTL-17ODF (1) Lumbala

想批量统计所有字母、数字和符号出现的次数【U、T、L、-、(、)、0、1、2……】:
U:108
T:108
L:109
(:4

请问如何得到这样的结果?
作者: ivor    时间: 2017-12-10 10:29

本帖最后由 ivor 于 2017-12-10 15:03 编辑

回复 1# dragon631
  1. # -*- coding:utf-8 -*-
  2. # python 3.x
  3. # search ascii code
  4. import re, sre_constants
  5. patter = [chr(i) for i in range(33,126)]
  6. with open("a.txt","r") as file:
  7.     content = file.read()
  8.     for i in patter:
  9.         try:
  10.             result = len(re.findall(r"[%s]" % i,content))
  11.         except sre_constants.error:
  12.             result = len(re.findall(r"[\%s]" % i,content))
  13.         if result != 0:
  14.             print("%s:%d" % (i, result))
复制代码
101M文本  处理平均速度10.670418739318848秒
作者: dragon631    时间: 2017-12-10 14:46

回复 2# ivor

运行这个批处理,没得到什么结果?
作者: ivor    时间: 2017-12-10 15:09

回复 3# dragon631


    需要安装Python 3运行,代码已更新,解决了特殊字符的问题
作者: CrLf    时间: 2017-12-10 15:31

命令行js:
  1. mshta http://bathome.net/s/hta/index.html map={};type('a.txt').replace(/./g,function(c){map[c]=map[c]?map[c]+1:0});JSON.stringify(map)
复制代码
grep + uniq:
  1. grep -o . a.txt | sort| uniq -c
复制代码
PowerShell:
  1. [char[]] [string] (type a.txt) | group
复制代码

作者: codegay    时间: 2017-12-10 23:37

本帖最后由 codegay 于 2017-12-11 00:16 编辑
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Dec 10 23:28:33 2017
  4. @author: codegay
  5. python3 & 编辑器 == spyder
  6. """
  7. with open("a.txt") as f:
  8.     txt = f.read()
  9.     #剔除不想统计的字符如回车,括号
  10.     char = list(set([r for r in txt if r not in """\n()()"""]))
  11.     result = {r: txt.count(r) for r in char}
  12.     # 排序
  13.     result = sorted(result.items(), key=lambda d: d[1], reverse=True)
  14. from pprint import pprint
  15. pprint(result)
  16. """
  17. [('-', 270),
  18. ('7', 144),
  19. ('8', 127),
  20. ('1', 123),
  21. ('9', 114),
  22. ('L', 109),
  23. ('O', 108),
  24. ('T', 108),
  25. ('F', 108),
  26. ('U', 108),
  27. ('J', 104),
  28. ('6', 36),
  29. ('4', 34),
  30. ('5', 31),
  31. ('3', 15),
  32. ('0', 15),
  33. ('2', 12),
  34. ('D', 4),
  35. ('M', 3),
  36. ('X', 3),
  37. (' ', 2),
  38. ('a', 2),
  39. ('u', 1),
  40. ('b', 1),
  41. ('l', 1),
  42. ('m', 1)]
  43. """
  44. 加了个排序。
复制代码

作者: codegay    时间: 2017-12-11 02:05

  1. from collections import Counter
  2. from pprint import pprint
  3. def charlist(txtfile):
  4.     with open(txtfile) as f:
  5.         txt = [r for r in f.read() if r not in """\n() """]
  6.         return txt
  7. pprint(Counter(charlist('a.txt')))
  8. '''
  9. Counter({'-': 270,
  10.          '7': 144,
  11.          '8': 127,
  12.          '1': 123,
  13.          '9': 114,
  14.          'L': 109,
  15.          'O': 108,
  16.          'T': 108,
  17.          'F': 108,
  18.          'U': 108,
  19.          'J': 104,
  20.          '6': 36,
  21.          '4': 34,
  22.          '5': 31,
  23.          '3': 15,
  24.          '0': 15,
  25.          '2': 12,
  26.          'D': 4,
  27.          'M': 3,
  28.          'X': 3,
  29.          'a': 2,
  30.          'u': 1,
  31.          'b': 1,
  32.          'l': 1,
  33.          'm': 1})
  34.     '''
复制代码
这个方法用了python 的标准库 collections里的函数。
作者: codegay    时间: 2017-12-11 03:38

nim语言的版本,感觉也还行。主要是用了标准库 中的CountTable,代码量不算太多。
  1. import tables
  2. var result = initCountTable[char]()
  3. for line in lines "a.txt":
  4.     for c in line:
  5.         result.inc c
  6. # 对统计结果排序
  7. sort result
  8. for k,v in pairs result:
  9.     echo k,": ",v
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2