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

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

写个批处理,统计一个文本中的数字出现次数,按从少到多顺序排列。
如文本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

高手帮我分析一下吧,谢谢~!

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

这个是依据什么计算出来的?

TOP

就是这堆数字中,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那样吧,不知道能处理吗?

TOP

多大也能处理,那就是要看时间多久了。期待大婶回复。

TOP

哈哈 个人觉得这个方法很靠谱
  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次,
复制代码

TOP

回复 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 (

这一行应该改一下吧,期待你的回复~!!

TOP

效率不高、没有排序。。。
  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
复制代码

TOP

回复 6# ketop


数据总量大概有多少?
能否上传部分真实数据方便测试?

TOP

怎么都没有人解决呢?

TOP

回复 9# ketop


    抽个时间回复一下7楼和8楼吧

TOP

本帖最后由 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
复制代码

TOP

回复 11# terse


    为什么我测试了不成功啊?

TOP

回复 7# apang


    我测试了,不行,不知道是不是文本内容太大的缘故。

TOP

回复 12# ketop

把你的文本发上来 文本大应该是一个因素
另 上面代码 漏写一处 已经改
其实 发上来看到 7楼一个思路

TOP

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

TOP

返回列表