找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 91765|回复: 40

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

[复制链接]
发表于 2008-7-26 01:40:51 | 显示全部楼层 |阅读模式

有文本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 编辑 ]
发表于 2008-7-26 02:18:43 | 显示全部楼层
这题还要输出最多的字符在第几行吗?
如果是,包含空行吗?
发表于 2008-7-26 06:29:44 | 显示全部楼层
@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

评分

参与人数 4PB +13 技术 +2 收起 理由
尘丶 + 1 学到了
Hello123World + 1 说到还是个算法问题!
pusofalse + 5
batman + 8 已经达到要求了,但还可简化。

查看全部评分

 楼主| 发表于 2008-7-26 08:19:57 | 显示全部楼层
下面给出本人的方案一:

  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 编辑 ]

评分

参与人数 1PB +5 收起 理由
pusofalse + 5

查看全部评分

发表于 2008-7-26 16:43:33 | 显示全部楼层
原帖由 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%%是字符数最多的行,没有进行条件约束而每次都赋值给它,导致输出的字符数正确,行的内容却每次都是最后的那一行。
 楼主| 发表于 2008-7-26 18:26:27 | 显示全部楼层
确实如此,粗心了,谢谢兄弟指出。
发表于 2008-7-30 10:59:38 | 显示全部楼层
  可以考虑 findstr /o 方案。
/O        在每个匹配行前打印字符偏移量。
 楼主| 发表于 2008-7-31 13:09:11 | 显示全部楼层
原帖由 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%!"
复制代码
发表于 2009-4-17 23:28:57 | 显示全部楼层
太复杂了,想办法优化:
  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
复制代码

评分

参与人数 1PB +3 收起 理由
batman + 3 为学习的精神加分

查看全部评分

 楼主| 发表于 2009-4-17 23:41:56 | 显示全部楼层
回复楼上:
兄弟看来是特有求知欲和动手欲的,这么老的练习贴子也让你翻到了,还做了解答,呵呵,加油。。。
发表于 2009-4-17 23:52:05 | 显示全部楼层
只能优化成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
复制代码
发表于 2009-4-17 23:55:08 | 显示全部楼层

回复 10楼 的帖子

我是新手,刚从新手训练营出来。
我从新手训练营出来后,就迷失方向了,不知道怎么继续学批处理了,我把论坛挨个翻了一遍,又发现在这一块,有好多题。
我就继续练下去。
请batman多多指教!
 楼主| 发表于 2009-4-18 00:04:06 | 显示全部楼层
呵呵,这块确实是很多人没有注意到的,如果说学批处理有速成班的话,这块就算是的吧。。。
祝兄弟学得开心并学有所成,本人将尽一切能力帮助学习批处理的新人们。
发表于 2009-4-18 01:35:20 | 显示全部楼层
  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
复制代码
只处理这个文本
发表于 2009-4-18 02:06:29 | 显示全部楼层
  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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:48 , Processed in 0.024027 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表