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

【练习-002】批处理查找字符数最多的文本行


有文本a.txt如下:
  1. aaaaaaa                                 aaaa bbbbbb ccccccccccc dddd
  2. aa  aaaaaaa bbbbbbbb cccccccccc ddddddddddddd eeeeeee
  3.      aaaaaaaaaaaa bbbbbbbbbbb cccccccccccccccccccc
  4.                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aa
  5.                     aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
  6. aaaaaaaaa        ccccccccc bbbbbbbbbbbbb               ddddddddddddddddd
复制代码
通过批处理查找出文本中字符数(不含空格)最多的行并输出,很明显就是
  1. aaaaaaaaa        ccccccccc bbbbbbbbbbbbb               ddddddddddddddddd
复制代码
要求:
1 不生成临时文件
2 代码简洁,高效,通用性好
3 加分仍以思路为重

----------------------------------------------------------------------------------------------------------------------------------------------------
至目前已有解决方案:见3楼浅默和4楼本人的方案,期待更多方案的出现。







[ 本帖最后由 batman 于 2008-7-27 23:58 编辑 ]
***共同提高***

这题还要输出最多的字符在第几行吗?
如果是,包含空行吗?
心绪平和,眼藏静谧。

TOP

@echo off
Setlocal Enabledelayedexpansion
set n=0
for /f "delims=" %%i in (a.txt) do (
      set "ke=%%i"
      set ke1=!ke: =!
      set m=0
      call :1                  
)
echo %wang%
pause
goto :eof
:1
  if not "!ke1:~%m%,1!"=="" set /a m+=1&goto 1
  if %m% gtr %n% set n=%m%&set wang=%ke%
  goto :eof
4

评分人数

TOP

下面给出本人的方案一:
  1. @echo off
  2. set num=0
  3. for /f "delims=" %%i in (a.txt) do  set "str=%%i"&call,set "str=%%str: =%%"&call :lp "%%i"
  4. call,echo %%_%num%%% %num%个字符
  5. pause>nul&goto :eof
  6. :lp
  7. set "str=%str:~1%"&set /a n+=1
  8. if defined str goto lp
  9. if %n% geq %num% set "num=%n%"&set "_%num%=%~1"
  10. set "n=0"
复制代码

[ 本帖最后由 batman 于 2008-7-26 18:25 编辑 ]
1

评分人数

***共同提高***

TOP

原帖由 batman 于 2008-7-26 08:19 发表
下面给出本人的方案一:@echo off
set num=0
for /f "delims=" %%i in (a.txt) do  set "str=%%i"&call,set "str=%%str: =%%"&call :lp "%%i"
call,echo %%_%num%%% %num%个字符
pause>nul&goto :eof
:lp
set  ...


有一点小错误,加完分才看出来。变量%%_%num%%是字符数最多的行,没有进行条件约束而每次都赋值给它,导致输出的字符数正确,行的内容却每次都是最后的那一行。
心绪平和,眼藏静谧。

TOP

确实如此,粗心了,谢谢兄弟指出。
***共同提高***

TOP

  可以考虑 findstr /o 方案。
/O        在每个匹配行前打印字符偏移量。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-7-30 10:59 发表
  可以考虑 findstr /o 方案。

思路是对的,但实施起来还真的有点麻烦:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "max=0"
  3. for /f "delims=" %%i in (1.txt) do set "str=%%i"&echo !str: =!>>2.txt
  4. echo end>>2.txt
  5. for /f "tokens=1* delims=: " %%i in ('findstr /o .* 2.txt') do (
  6.     set /a n+=1&set "_!n!=%%i"&set ".!n!=%%j"
  7.     set /a m=n-1
  8.   if !m! geq 1 call :lp
  9. )
  10. echo.&echo 字符数最多的行为:!a%max%!
  11. echo.&echo     字符数为:%max%个   
  12. del /q 2.txt&pause>nul&goto :eof
  13. :lp
  14. set /a num=_%n%-_%m%-2
  15. if %num% gtr %max% set "max=%num%"&set "a!max!=!.%m%!"
复制代码
***共同提高***

TOP

太复杂了,想办法优化:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     set v=%%i
  4.     set n=0
  5.     set /a m+=1
  6.     call :lp
  7.     set _!m!=!n!#%%i
  8. )
  9. set max=0
  10. call :next
  11. for /f "tokens=1 delims=#" %%a in ("!var!") do (
  12.         set s=%%a
  13.         if !s! gtr %max% set max=!s!
  14. )
  15. call :next
  16. for /f "tokens=1,2 delims=#" %%a in ("!var!") do (
  17.         if %%a==%max% echo %%b
  18. )
  19. pause&exit/b
  20. :next
  21. for /l %%i in (1 1 %m%) do (
  22.     set c=%%i
  23.     call,set var=%%_!c!%%
  24. )
  25. goto :eof
  26. :lp
  27.     if "!v:~0,1!" neq " " set /a n+=1
  28.     set v=!v:~1!
  29.     if "!v!" neq "" goto lp
  30. goto :eof
复制代码
1

评分人数

    • batman: 为学习的精神加分PB + 3
(*^_^*)

TOP

回复楼上:
兄弟看来是特有求知欲和动手欲的,这么老的练习贴子也让你翻到了,还做了解答,呵呵,加油。。。
***共同提高***

TOP

只能优化成3楼的了:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     set v=%%i
  4.     set /a max=0,n=0,m+=1
  5.     call :lp
  6.     if !n! gtr !max! set max=!n!&set xx=%%i
  7. )
  8. echo %xx%&pause&exit/b
  9. :lp
  10.     if "!v:~0,1!" neq " " set /a n+=1
  11.     set v=!v:~1!
  12.     if "!v!" neq "" goto lp
  13. goto :eof
复制代码
(*^_^*)

TOP

回复 10楼 的帖子

我是新手,刚从新手训练营出来。
我从新手训练营出来后,就迷失方向了,不知道怎么继续学批处理了,我把论坛挨个翻了一遍,又发现在这一块,有好多题。
我就继续练下去。
请batman多多指教!
(*^_^*)

TOP

呵呵,这块确实是很多人没有注意到的,如果说学批处理有速成班的话,这块就算是的吧。。。
祝兄弟学得开心并学有所成,本人将尽一切能力帮助学习批处理的新人们。
***共同提高***

TOP

  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do (
  3. for %%b in (%%a) do call :xxx "%%b"
  4. call :yyy
  5. )
  6. for /f "tokens=2,3 delims=_=" %%i in ('set l_^|sort /+4') do set msg=最长的行为:%%i  长度为:%%j
  7. echo %msg%
  8. pause
  9. goto :eof
  10. :xxx
  11. set "lines=%lines%%~1"
  12. goto :eof
  13. :yyy
  14. set /a x+=1
  15. for /f "skip=1 delims=:" %%i in ('^(echo "%lines%"^&echo.^)^|findstr /o ".*"') do set/a l_%x%=%%i-5
  16. set lines=
  17. goto :eof
复制代码
只处理这个文本

TOP

  1. @echo off
  2. set max=0
  3. for /f "tokens=*" %%a in (a.txt) do (
  4.   if "%%a" neq "" call :ready "%%a"
  5. )
  6. echo 第 %strline% 行字数最多,共 %max% 个字符:&echo.&echo %str%&echo.
  7. pause & exit /b
  8. :ready
  9. set var=%~1
  10. set var=%var: =%
  11. set /a n=0,line+=1
  12. :lp
  13. set fifteen=%var:~,15%fedcba987654321
  14. set /a n+=0x%fifteen:~15,1%
  15. if "%var:~15%" neq "" set "var=%var:~15%" & goto lp
  16. if %n% gtr %max% set /a "max=n,strline=line" & set str=%~1
复制代码

TOP

返回列表