Board logo

标题: [文本处理] 应该如何写这个批处理统计一个文本中的数字出现次数 [打印本页]

作者: ketop    时间: 2012-9-20 09:58     标题: 应该如何写这个批处理统计一个文本中的数字出现次数

写个批处理,统计一个文本中的数字出现次数,按从少到多顺序排列。
如文本1.txt里的内容为:
5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 。。。。。。。。。
内容比较多,要求统计在0后面出现数字从少到多次序排列出来
如:
0后面出现的数字:1为0次,2为0次,3为0次,5为0次,6为0次,7为0次,9为0次,4为1次,8为2次。。。。。。。。。;
1后面出现的数字:。。。。。。。。。。。。。。。。。

我刚接触,很多都看不懂,不过我知道有段代码可以借鉴:
@echo off
setlocal enabledelayedexpansion
:i
for /f "delims=: tokens=1" %%i in ('findstr /n "." 1.txt') do (
set end=%%i
)
set /a end-=6
set a=1
for /f "tokens=*" %%i in ('more +%end% 1.txt') do (
set a!a!=%%i
set /a a+=1
)
set str=
set ok=
for /l %%i in (0,1,9) do (
call :set %%i
set n%%i=!back!
if !back!==0 set "str=%%i !str!"
)
md tmp
cd tmp
for /l %%i in (0,1,9) do if not !n%%i!==0 (
  for /l %%a in (1,1,!n%%i!) do (echo.a>>%%i)
)
set /p=出现频率:<nul
for /f "tokens=*" %%i in ('dir /b /o:-s') do (
set /p=%%i-!n%%i!次 <nul
)
cd..
rd /s /q tmp>nul
echo.
echo.没出现过的数字有:%str%
echo.按任意键重新运行一次。
pause>nul
goto :i
:set
set back=-6
for /l %%i in (1,1,6) do (
  set "b%%i=!a%%i:%1=t,t!"
  for %%a in (!b%%i!) do set /a back+=1
)
goto :eof

高手帮我分析一下吧,谢谢~!
作者: apang    时间: 2012-9-20 10:38

0后面出现的数字:1为0次,2为0次,3为0次,5为0次,6为0次,7为0次,9为0次,4为1次,8为2次。。。

这个是依据什么计算出来的?
作者: ketop    时间: 2012-9-20 11:11

就是这堆数字中,5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 。。。。。。。。。
紧挨着0后面出现的数字
紧挨着0后面没有1出现过,所以1是0次,8在0后面出现过2次,4出现过1次
要处理的文本比较大,大概几百k到1m那样吧,不知道能处理吗?
作者: lky216    时间: 2012-9-20 12:06

多大也能处理,那就是要看时间多久了。期待大婶回复。
作者: 冷玉公子    时间: 2012-9-20 15:41

哈哈 个人觉得这个方法很靠谱
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For %%A In (1 2 3 4 5 6 7 8 9) Do Set _%%A=0
  3. For %%A In (5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 0 4 2 5 1 0 5 2 5 1) Do (
  4. If "!Is!" == "1" Set /A "_%%A+=1" & Set "Is="
  5. If %%A Equ 0 Set "Is=1"
  6. )
  7. Set /P Echo=0后面出现的数字:< Nul
  8. For /F "tokens=1,2 delims=_=" %%A In ('Set _') Do (
  9. Set /P Echo=%%A为%%B次,< Nul
  10. )
  11. Pause>Nul
复制代码
上面的命令执行结果为:
  1. 0后面出现的数字:1为0次,2为0次,3为0次,4为2次,5为1次,6为0次,7为0次,8为2次,9为0次,
复制代码

作者: ketop    时间: 2012-9-20 17:47

回复 5# 冷玉公子


    你好,谢谢你的回复,不过我要处理的不仅仅是那一点数据,而且一个1.txt文本,里面的内容比那一行数字大多了,For %%A In (5 2 5 4 6 1 2 5 0 8 7 9 5 4 6 2 0 8 9 7 6 0 4 2 5 1 0 4 2 5 1 0 5 2 5 1) Do (

这一行应该改一下吧,期待你的回复~!!
作者: apang    时间: 2012-9-20 23:44

效率不高、没有排序。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set "str=$%%a$"
  4.   for /l %%b in (0 1 9) do (
  5.     for /l %%c in (0 1 9) do (
  6.       for %%d in ("!str:%%b %%c=" "!") do set/a .%%b%%c+=1
  7.       set/a .%%b%%c-=1
  8.     )
  9.   )
  10. )
  11. (for /l %%a in (0 1 9) do (
  12.   for /l %%b in (0 1 9) do set "v=!v!,%%b为!.%%a%%b!次"
  13.   echo,%%a后面数字: !v:~1!
  14.   set "v="
  15. ))>b.txt
复制代码

作者: forfiles    时间: 2012-9-20 23:54

回复 6# ketop


数据总量大概有多少?
能否上传部分真实数据方便测试?
作者: ketop    时间: 2012-9-21 00:01

怎么都没有人解决呢?
作者: forfiles    时间: 2012-9-21 00:17

回复 9# ketop


    抽个时间回复一下7楼和8楼吧
作者: terse    时间: 2012-9-21 01:35

本帖最后由 terse 于 2012-9-21 02:47 编辑

也没排序
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set "i="
  4.     for %%j in (%%i) do (
  5.         set /a "_!i!_%%j+=1"
  6.         set i=%%j
  7.     )
  8. )
  9. for /l %%i in (0 1 9) do (
  10.    for /l %%j in (0 1 9) do if defined _%%i_%%j (set "var=!var! %%j-!_%%i_%%j!次") else set "var=!var! %%j-0次"
  11.    echo;%%i后面:!var!&set var=
  12. )
  13. pause
复制代码

作者: ketop    时间: 2012-9-21 02:02

回复 11# terse


    为什么我测试了不成功啊?
作者: ketop    时间: 2012-9-21 02:05

回复 7# apang


    我测试了,不行,不知道是不是文本内容太大的缘故。
作者: terse    时间: 2012-9-21 02:46

回复 12# ketop

把你的文本发上来 文本大应该是一个因素
另 上面代码 漏写一处 已经改
其实 发上来看到 7楼一个思路
作者: 全天占线    时间: 2012-9-21 03:20

  1. gawk "{for(i=2;i<NF;i++){$($(i-1)$i)++};for(i=0;i<=9;i++){print i,$(0i)}}" 1.txt|sort /+2
复制代码

作者: forfiles    时间: 2012-9-21 08:28

回复 13# ketop


    请把测试数据和测试结果贴出来,否则单凭“不行”二字别人很难知道如何继续帮助你。
作者: yyykkkyyyy    时间: 2012-9-23 23:30

确实应该把情况说详细些, 估计是一行字符太多... 拼凑了一段 —— 针对文本仅一长行 为输出整齐一点, 取每个统计数最多3位数 (不然修改这句 set/p "=  %%a 有!b.:~-3!")
  1. @echo off <nul 3<1.txt
  2. setlocal enabledelayedexpansion
  3. :lp
  4. set a=&set/p a=
  5. if "%a%"=="" goto :next
  6. if "%a: =%"=="" goto :next
  7. for %%b in (%a%)do (
  8.     set/a y!o!%%b+=1
  9.     set "o=%%b"
  10. )
  11. goto :lp
  12. :next
  13. for /L %%i in (0 1 9)do for /L %%j in (0 1 9)do (
  14.       set/a "u=!y%%i%%j!+100000"
  15.       set/a "#%%i#!u!#%%j=!y%%i%%j!+0"
  16. )
  17. (for /L %%h in (0 1 9)do (
  18.    set/p"=%%h 后:"
  19.    set n=0
  20.    for /f "tokens=3,4 delims=#=" %%a in ('set #%%h')do (
  21.       set "b.=      %%b"
  22.       set/p "=  %%a 有!b.:~-3!"
  23.       if !n! neq 9 set/p "i=, "
  24.       set/a n+=1
  25.    )
  26.    echo\
  27. ))<nul>2.txt
  28. endlocal<nul 4<con
  29. pause
复制代码

作者: ketop    时间: 2012-9-26 18:14

谢谢各位,问题已经有人帮解决了,谢谢!




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