[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
看来从心动到行动
还有很长的距离啊
  1. ::  GetMaxCharText.cmd - 找出字符最多的文本行
  2. ::  qzwqzw - 2010-01-05
  3. ::
  4. ::  基本构思:
  5. ::      将原文本每行尾部加足够的一定数量的空格,在文本右侧形成一个不等齐空格区域
  6. ::      原文本行越长,其后的空格区域就越长,然后用sort /+n 仅对空格区域进行排序
  7. ::      因为区域内都是空格,则排序的依据就是空格的长度,也就是原行文本的长度
  8. ::
  9. @echo off & setlocal EnableDelayedExpansion
  10. set maxLineLen=80
  11. set infile=%~sf0
  12. for /l %%i in (1,1,%maxLineLen%) do set zone= !zone!
  13. :: findstr 会忽略空行和仅含空格的行,但显示行号会跨过这些行,这是我们需要的特性
  14. :: 将行号与行文本分别处理,是因为不对齐行号会影响行文本长度的判断
  15. (for /f "tokens=1* delims=:" %%l in ('findstr /n /r /c:"[^ ]"  %infile%') do (
  16.     set LineNo=         %%l
  17.     set LineNo=!LineNo:~-10!
  18.     set Line=%%m
  19.     set Line=!Line: =!
  20.     echo.!LineNo!:!Line!!zone!
  21. ))>%temp%\%~sn0~1.t~1
  22. sort /r /+%maxLineLen% %temp%\%~sn0.t~1 > %temp%\%~sn0.t~2
  23. set/p maxLine=< %temp%\%~sn0.t~2 >nul
  24. ::  已找到最多字符的行,以下是提取行号和原行文本,行长度因未要求而忽略
  25. for /f "delims=: " %%i in ("%maxline%") do set maxLineIdx=%%i
  26. ::  使用find而不是findstr,是因为find够用够简单
  27. set seekLine=find /v /n "" ^^^<%infile%^^^|find "[%maxLineIdx%]"
  28. echo.字符最多的行第 %maxLineIdx% 行,内容为:
  29. for /f "tokens=1* delims=[]" %%l in ('%seekLine%') do echo.%%m
  30. for %%f in (%temp%\%~sn0.t*) do del %%f
复制代码

[ 本帖最后由 qzwqzw 于 2010-1-5 10:46 编辑 ]

TOP

23# zm900612
代码过于求奇求异
又缺乏必要的注释
是在考验读者的耐心
我不欣赏这样的风格
天的白色影子

TOP

代码看着顺畅多了
不需要实际测试与断点跟踪也能明白思路
给两个建议:
1、set /a h=n-128移到for之外
2、取最长行用for/f+sort又成为线性算法
for/f需要完整遍历整个文件才能取得最长行
与你通篇的算法思路相左
不如仍然用set/p+sort /r
至于变量长度这与for/f中的set long有不同吗?
天的白色影子

TOP

另外发现一个小问题
悄悄的告诉你
楼主的题目要求是获取不包含空格的字符数最多行
天的白色影子

TOP

set /a的问题不是在效率上
而是在逻辑上
因为你在set /a n+=%%a时并没有计算h
那么如果set /a n-=%%a在特定条件下没有运行一次
那么h的取值为空
或者set /a n-=%%a最后一次没有运行
那么h的取值会差1

set/p的字符长度限制确实是忘记了
记忆力确实越来越差了
扩展测试了一下
windows记事本也有每行1024字符的限制
find命令同样也有

不过你的改进思路有些问题
似乎忘记了sort /r
天的白色影子

TOP

怎么看怎么觉得这个修改后的代码仍然有问题
没有实测
就是觉得sort 既不用+%h% 也不用 /r
会将a.txt排序成什么样子
而第二个findstr 为什么还会用a.txt?
天的白色影子

TOP

返回列表