无忧启动论坛

标题: 如何用批处理给一个文本文件内容统计并排序? [打印本页]

作者: 2011xiao8xiao    时间: 2011-9-25 23:12
标题: 如何用批处理给一个文本文件内容统计并排序?
如(一个文本文件内容):
我              我 你      他 他 他 你              你 你 你 他 他  
他 他 他 我 我 你 我
他 你 你 你 我 我 他


希望结果显示为(输出到一个新的文本文件最好):
他 10
你 9
我 6

作者: dos时代菜鸟    时间: 2011-9-26 13:02
如果能确定每一个字 都有空格相隔就好办多了。信息放到 x.txt 中
看看下面的:

@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
set t=0 & set w=0 & set n=0
for /f "delims=" %%c in (x.txt) do (
for %%d in (%%c) do (
   if %%d*==他* set /a t+=1
   if %%d*==我* set /a w+=1
   if %%d*==你* set /a n+=1
)
)
echo 他 %t%
echo 你 %n%
echo 我 %w%
作者: 2011_sim    时间: 2011-9-26 14:34
原帖由 dos时代菜鸟 于 2011-9-26 13:02 发表
如果能确定每一个字 都有空格相隔就好办多了。信息放到 x.txt 中
看看下面的:

@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
set t=0 & set w=0 & set n=0
for /f "delims=" %%c in (x.txt) do (
for %%d in (%%c) do (
   if %%d*==他* set /a t+=1
   if %%d*==我* set /a w+=1
   if %%d*==你* set /a n+=1
)
)
echo 他 %t%
echo 你 %n%
echo 我 %w%


斗胆妄自精简一下:
@echo off
for /f delims^= %%c in (x.txt) do (
for %%d in (%%c) do (
   if %%d*==他* set /a t+=1
   if %%d*==我* set /a w+=1
   if %%d*==你* set /a n+=1
))
(echo.他 %t%&echo.你 %n%&echo.我 %w%)>目标文件.txt
目标文件.txt:
他 10
你 9
我 7

[ 本帖最后由 2011_sim 于 2011-9-26 14:39 编辑 ]
作者: x9tian    时间: 2011-9-29 09:00
原帖由 2011_sim 于 2011-9-26 14:34 发表


斗胆妄自精简一下:
@echo off
for /f delims^= %%c in (x.txt) do (
for %%d in (%%c) do (
   if %%d*==他* set /a t+=1
   if %%d*==我* set /a w+=1
   if %%d*==你* set /a n+=1
))
(echo.他 % ...


  来招秒杀一切
  1. (for /f "usebackq delims=" %%i in ("%~dp0文本.txt") do (for %%a in (%%i) do if not defined %%a (set/a %%a+=1) else set /a %%a+=1))&&call echo.%%我%% %%你%% %%他%%
复制代码

作者: x9tian    时间: 2011-9-29 09:08
再来个更精简的。。

  1. (for /f "usebackq delims=" %%i in ("%~dp0文本.txt") do (for %%a in (%%i) do if not defined %%a (set/a _%%a+=1) else set /a _%%a=+=1))&&set _
复制代码

作者: 2011_sim    时间: 2011-9-29 09:45
原帖由 x9tian 于 2011-9-29 09:08 发表
再来个更精简的。。

(for /f "usebackq delims=" %%i in ("%~dp0文本.txt") do (for %%a in (%%i) do if not defined %%a (set/a _%%a+=1) else set /a _%%a=+=1))&&set _


这段代码构思巧妙!!佩服!
另外: 发现一个bug或者是x9tian 兄笔误
else set /a _%%a=+=1第一个=会被当作赋值符=,当条件不成立时可能会造成找不到操作数的错误。
可能我理解有误,不当之处请指正。

[ 本帖最后由 2011_sim 于 2011-9-29 17:32 编辑 ]
作者: 2011xiao8xiao    时间: 2011-9-30 10:54
原帖由 x9tian 于 2011-9-29 09:08 发表
再来个更精简的。。

(for /f "usebackq delims=" %%i in ("%~dp0文本.txt") do (for %%a in (%%i) do if not defined %%a (set/a _%%a+=1) else set /a _%%a=+=1))&&set _



无比的感谢!!!

已经试用了,真的很强很强,还有点小要求,有没有办法输出到一个新的文本文本里???
作者: 2011_sim    时间: 2011-9-30 11:32
原帖由 2011xiao8xiao 于 2011-9-30 10:54 发表



无比的感谢!!!

已经试用了,真的很强很强,还有点小要求,有没有办法输出到一个新的文本文本里???

(for /f "usebackq delims=" %%i in ("%~dp01.txt") do (for %%a in (%%i) do if not defined %%a (set/a _%%a+=1) else set /a _%%a:+=1))&&(set _)>目标文件.txt

[ 本帖最后由 2011_sim 于 2011-9-30 12:09 编辑 ]
作者: 2011xiao8xiao    时间: 2011-9-30 13:35
原帖由 2011_sim 于 2011-9-30 11:32 发表

(for /f "usebackq delims=" %%i in ("%~dp01.txt") do (for %%a in (%%i) do if not defined %%a (set/a _%%a+=1) else set /a _%%a:+=1))&&(set _)>目标文件.txt


越来越接近理想了,还差一步就完工了 ^o^ 那就是希望能够排序,从最高次数排下来。

再次感谢伸出援手相助的人!!!谢谢你们了!
作者: x9tian    时间: 2011-10-6 13:06
原帖由 <i>2011xiao8xiao</i> 于 2011-9-30 13:35 发表 <a href="http://bbs.wuyou.net/redirect.php?goto=findpost&pid=2312428&ptid=199541" target="_blank"><img src="http://bbs.wuyou.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />

<br />

<br />
越来越接近理想了,还差一步就完工了 ^o^ 那就是希望能够排序,从最高次数排下来。<br />
<br />
再次感谢伸出援手相助的人!!!谢谢你们了!
<br />
弱弱的问下楼主,你不会是统记一本书里面出现了多少个汉字, 和它们使用的频率吧.

  我实在想不出这是做什么喔  ,0.0
作者: x9tian    时间: 2011-10-6 13:13
原帖由 <i>2011_sim</i> 于 2011-9-29 09:45 发表 <a href="http://bbs.wuyou.net/redirect.php?goto=findpost&pid=2311792&ptid=199541" target="_blank"><img src="http://bbs.wuyou.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />

<br />

<br />
这段代码构思巧妙!!佩服!<br />
另外: 发现一个bug或者是x9tian 兄笔误<br />
else set /a _%%a=+=1第一个=会被当作赋值符=,当条件不成立时可能会造成找不到操作数的错误。<br />
可能我理解有误,不当之处请指正。
<br />

在XPSP3 下是没事的,  不信你试下,   SET 命令是有句,不允许变量的值里面直截出现等于号, 但是变量名是可以存在等于号的,所以这里不存在问题的.  这也算个小技巧吧, 如果要直截取变量为"我,你,他时"  可以为下面的工作更好的处理.




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3