[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  排序一般要用到sort,不过,sort是逐位做比较,比如sort认为12大于100,因为第二位上,2大于0。要避免这样的情况,可以考虑只对同一长度的数字串做比较。例如以下代码就可以成功解决逐位比较和超大数带来的问题,只不过效率比较低下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 统计数字串的最大长度
  4. set max=0
  5. for /f %%i in (test.txt) do (
  6.     set length=0
  7.     call :CheckLength %%i
  8.     if !length! geq !max! set max=!length!
  9. )
  10. :: 在文本最后插入空行,消除findstr整行匹配时忽略最后一行带来的影响
  11. echo.>>test.txt
  12. :: 对同一长度的数字串做比较
  13. for /l %%i in (1,1,%max%) do (
  14.     set str=!str![0-9]
  15.     for /f %%j in ('findstr /be "!str!" test.txt^|sort') do echo %%j
  16. )
  17. pause
  18. exit
  19. :CheckLength
  20. set str=%1
  21. :loop
  22. set /a length+=1
  23. set str=!str:~1!
  24. if defined str goto loop
  25. goto :eof
复制代码
1

评分人数

TOP

  4楼获取数字串长度值并和数字串并排的方法,实际上是很难实现的,因为sort并不能分离出同一长度的数字串;就算是分离出来了,还会生成临时文件;综合起来考虑的话,效率应该还没有2楼的高。

  3楼补零的方法效率大为提升,并且不会导致产生findstr的错误,应该是这个问题的完美解决方案。顺便提醒一下,%~0 最好写成 "%~0" ,以避免特殊路径带来的影响。通过测试,用2楼的代码处理超过15位的数字就会产生错误,但是,单用findstr来搜索超过15位的数字时,并没有任何问题,可能是 findstr.exe 设计上的bug。

TOP

返回列表