[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何统计txt文本每行字符串出现的次数?

  1. @echo off&setlocal enabledelayedexpansion
  2. sort a.txt | findstr . >temp.tx
  3. set /pstr=<temp.tx
  4. set num=1000000001
  5. (for /f "skip=1 delims=" %%i in (temp.tx) do (     
  6.     if "!str!" neq "%%i" (
  7.        echo;!num:~1!  !str!
  8.        set num=1000000001
  9.     ) else set /a num+=1
  10.       set str=%%i
  11. )
  12.        echo;!num:~1!  !str!
  13. )>sort.txt
  14. sort /r sort.txt >temp.tx
  15. (for /f "tokens=* delims=0" %%i in (temp.tx) do echo;%%i)>sort.txt
  16. del temp.tx
  17. pause
复制代码
求解用这个代码统计数字可以,英文就不行




解压后然后用这个BAT进行统计,就出问题


统计后,很多重复出现的

统计后的:

513340  a
125258  q        <<<<-----------------------------------------------------------------------------
76660  w
71654  z
39801  s
37051  x
29514  l
21589  c
21297  y
19345  z
16611  m
14866  f
14802  h
14050  d
12060  g
11941  b
11021  k
10528  t
10507  j
9588  p
9406  w
6718  q       <<<<----------------------------------------------------------------------------------------
6495  A
4691  l
4258  r
3918  e
3402  h
3195  n
3155  v
2813  o
2559  o
2471  E
1763  i
1654  Q
1111  Z
1017  W
933  L
920  u
857  X
777  b
645  H
505  F
491  S
426  G
404  B
393  C
388  Y
384  D
383  O
366  M
307  T
292  K
272  J
235  n
230  P
168  R
114  N
79  I
46  V
21  U
1  y
1  W
1  v
1  u
1  t
1  R
1  O
1  k
1  j
1  I
1  g
1  f




大神过帮帮我,纠结了差不多半个月了,我需要统计一个70MB左右的TXT文本文档。。。。

原地址6楼

http://www.bathome.net/redirect. ... 2881&ptid=24860

你的数据很有意思:
1 行数比较大,1000多万行,但每行并不长。直接用powershell命令来处理,比较费内存,我用16g内存也非常卡,但貌似有人有64也不128内存来着。有空我找他算算。
2 昨我用powershell手写了个占内存不太大的,占用内存不到2g,但是占用cpu比较多,测试的时候还有问题,就不发了。
3 我又写了个通用的文档切割脚本,把文档变小,50万行,powershell,或者excel就容易处理了。等下发上来。
4 我早说过,这类问题最好,最快就是用数据库。关系型数据库虽说大家都喊太慢,不如nosql。但玩这个还是很快的,我是指查询。
  数据库玩这个,是一种以空间换时间的做法,做好了索引,就不用像脚本那样,每次都统计一遍数量了。
  这不,我做好了sqlite的数据库,作的时候慢,尤其是索引,但关键是用索引,索引就是排序+数量统计,有了它,亿万数据瞬间直达,这不,
  我下述的查询代码,基本上都2---3秒完成。
  而且后续你又有了新的数据,可以继续往数据库中导入,插入,然后重新查询,也会很快。因为有了索引,基本上都2---3秒完成。
  所以说,根本就不应该用脚本统计,就应该用数据库。你的问题用数据库解决才是完美的。

-------------------------用 sqlite 玩转你的问题 --------------------------------------------  
压缩包=138MB

下载地址
http://pan.baidu.com/s/1bny7znL



用法:
1 安装Navicat_for_SQLite_11.0.10_XiaZaiBa.exe
2 打开数据库 wordcount ,右击main,选sql命令,输入查询语句。


表名=wordcount001
字段名=myword

查询某个单词‘A’,数量语句:
select count(myword) from wordcount001 where myword='A';


myword 所有行去重
SELECT DISTINCT myword  from wordcount001 ;


输出2列,第一列单词名,第二列单词个数,单词个数最多的在上面。 ---这就是你要的
SELECT  myword,count(myword) as chongfushu   from wordcount001 group by myword order by chongfushu desc;


这个文档中小写的a最多,达到了513340个。这个结果对了么?

------------------------------------------------------------------------------------------------------------
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 55# terse

好,我试试这个。

TOP

回复 52# nono84223860
另 原先的三方 GAWK 速度明显提高 可以试下
GAWK 论坛有下载的
  1. @echo off
  2. (gawk -vt=10000000000 "{ar[$0]++}END{l=asorti(ar,b);for(i=1;i<=l;i++) a[ar[b[i]]+t,b[i]];asorti(a);for(i=l;i>=1;i--) {split(a[i],b,SUBSEP);print b[1]%%t,b[2]}}")<a.txt >b.txt
  3. pause
复制代码

TOP

回复 53# terse


我处理了2个小时才完成,近200MB

刚刚我对比了一下

很多数字没有了

我发到你私聊里

你有Q吗,我私传给你

把Q发到我私聊里

TOP

回复 52# nono84223860

你弄个样本测试下

TOP

回复  nono84223860
用P处理大文件 还是比较吃力吧
不清楚 sort 为什么会把字母分成如这样 fffffffFFFF ...
terse 发表于 2014-5-15 15:14



    我用这个脚本统计数字,和我楼顶上的统计差距很大,

  统计英文可以说什么误差

TOP

回复 50# nono84223860

什么情况啊 能表述详细否

TOP

本帖最后由 nono84223860 于 2014-5-15 21:54 编辑

回复 34# terse

又有新问题了。。。。。。。。。。。。。。。。

这个统计出来不完整。。。。

比如:

有410218个     123456    用以前的统计出来的123456

有24258个       123456   用你今天给我的统计123456


差很远。。怎么回事

如果是统计英文差距很小。因为以前的脚本有点问题。所以误差也不出奇,但是没什么差距,甚至有些英文出现次数还是一样的

TOP

回复 48# nono84223860
  1. @if(0)==(0) echo off
  2. CScript.exe //NoLogo //E:JScript "%~f0" <a.txt >b.txt
  3. pause&goto:eof
  4. @end
  5. var arr = [];
  6. while (!WScript.StdIn.AtEndOfStream){
  7.     var str = WScript.StdIn.Readline();
  8.     if (arr[str]){arr[str]++};
  9.     else {arr[str] = 1};
  10. }
  11. var array = [];
  12. for (var key in arr) array.push([key, arr[key]]);
  13. array.sort(function(a, b){ return b[1] - a[1];});
  14. for (var i = 0; i < array.length; i++) {
  15.     WScript.Echo(array[i][1],array[i][0])
  16. }
复制代码

TOP

回复 47# DAIC

这个是70MB里面的其中一部分展示,里面再也没有出现重复了,准确无误,如果能在出现的次数放在前面,后面是英文就好看的比较舒服直观些,


大神果然厉害,哈哈  34楼

TOP

回复 45# nono84223860


    这个是用几楼的代码得到的结果?

TOP

回复 44# DAIC

最后非常感谢大神耐心指导,小弟感激不尽

TOP

回复 44# DAIC


36楼的吃内存,电脑很卡,如果能内存大,可能这个快一些

你后面的方法 10分钟左右,完成70M的处理 准确无误 ,也算非常快的

efbcaffbadcceefahelldamnithelldamnit 1
dfbfbbcfbeffaef**leibofangleibofang 1
aedeaeffcfbfdbbdeleidcrleidcrzjj 1
adbabfddadceleileileileiwc 1
adadebebbaaddbleilovelleilovel 1
fdffbcbaccaabbaafleinaleideleinaleide 1
bbdbcdcbbleishangleishang 1
daeaabfbdbcebfdbcleitinleitin 1
caonniang 1
leizhiqiang 1
daaecacadedbbleklovescleklovesc 1
bcbbbablemonlemon 1
fdeccbeedcbshowliranshowliranbjhak 1
qudaohaod 1
efcadcceaefbbbfclennonleelennonlee 1
accaefedadleonbleonb 1
fcaafbfcleonalucardleonalucardmsnsazabi 1
ebbfdfbedleonardoleonardoeadcbaabbeeffe 1
bcddcdfac 1
fccffeaeaeeddleonidasleonidas 1
cbaceecacddaapcpspps 1

如果能改进一下,前面位数字,后面为英文,这样看得舒服点,如果改不了就算了,完美了,哈哈

TOP

回复 43# nono84223860


等36楼的ps1代码出来之后,可以跟gawk比较一下,哪个快就用哪个。

TOP

返回列表