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

[文本处理] 批处理通用排序代码,大家来看哦。

本帖最后由 冷玉公子 于 2011-9-9 10:24 编辑

例如要处理的文本,是分别根绝两个问题写出的。

第一个 排序IP地址

内容为:
  1. 192.168.1.45
  2. 192.168.1.65
  3. 192.168.1.27
  4. 192.168.1.102
  5. 192.168.1.38
  6. 192.168.1.26
  7. 192.168.1.89
  8. 192.168.1.76
  9. 192.168.1.235
  10. 192.168.1.165
  11. 192.168.1.178
  12. 192.168.1.245
  13. 192.168.1.239
  14. 192.168.1.186
  15. 192.168.1.98
  16. 192.168.1.80
  17. 192.168.1.83
  18. 192.168.1.85
复制代码
对应的代码如下:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. @Rem 关闭回显并打开变量延迟
  3. Set /P Var_Filepach=请讲要处理的文件,拖入此框中。
  4. @Rem 这个我觉得不用作解释吧 哈哈
  5. @Rem 检测要处理文件的行数,并将每一行赋值于一个数组中。
  6. For /f %%a in (%Var_Filepach%) do (
  7. Set /a NumValue+=1
  8. Set "StrLine!NumValue!=%%a"
  9. )
  10. @Rem 处理过程 具体看下面的注释
  11. For /l %%z in (1,1,%NumValue%) do (
  12. @Rem 第一个For循环,循环次数为文本的总行数。
  13. For /l %%a in (1,1,%NumValue%) do (
  14. @Rem 第二个循环,循环次数为文本的总行数,其实是为第一次排序。
  15. For /f "tokens=4 delims=." %%b in ("!StrLine%%a!") do Set StrLineNumValueA=%%b
  16. @Rem 找出排序依序值,本例中处理的是C类IP地址。所以取的值为最后一个IP地址.
  17. Set "Var_Stepvalue=%%a"
  18. Set /a Var_Stepvalue+=1
  19. If !Var_Stepvalue! GEQ %NumValue% Set Var_Stepvalue=%NumValue%
  20. @Rem 这个IF只是用来限制判断行数不能超出最大的行数
  21. Echo !Var_Stepvalue! > %Temp%\Temp
  22. @Rem 因批处理没有办法或者说本人还没有发现更好的方法来实现真正的数组,所以只能利用局部变量来代替数组编号。
  23. @Rem 所以将这个位置的值用所需要的值,加1然后输出到一个文本中。方便让下一个For来将其作为局部变量来使用
  24. For /f %%b in (%Temp%\Temp) do (
  25. @Rem 读取所需要的数组代号并赋值于局部变量%%b
  26. For /f "tokens=4 delims=." %%b in ("!StrLine%%b!") do Set StrLineNumValueB=%%b
  27. @Rem 提取出于第一个数值做比较的第二个数值
  28. If !StrLineNumValueA! GTR !StrLineNumValueB! (
  29. @Rem 判断第二个数值是否大于第一个数值
  30. Set "StrLineT=!StrLine%%a!"
  31. Set "StrLine%%a=!StrLine%%b!"
  32. Set "StrLine%%b=!StrLineT!"
  33. @Rem 这三个命令其实就是说,如果第二个大于第一个就将两个数组中的数值做一个替换
  34. )
  35. )
  36. )
  37. )
  38. For /l %%a in (1,1,%NumValue%) do (
  39. Echo !StrLine%%a!
  40. )
  41. @Rem 将排序好的数组显示出来
  42. Pause
复制代码
第二个 排序http://www.bathome.net/thread-13994-1-1.html此帖的问题
内容为:
  1. 4100
  2. 100
  3. 555000
  4. 1313
  5. 56565984
  6. 131389949
复制代码
对应的代码为:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. @Rem 关闭回显并打开变量延迟
  3. Set /P Var_Filepach=请讲要处理的文件,拖入此框中。
  4. @Rem 这个我觉得不用作解释吧 哈哈
  5. @Rem 检测要处理文件的行数,并将每一行赋值于一个数组中。
  6. For /f %%a in (%Var_Filepach%) do (
  7. Set /a NumValue+=1
  8. Set "StrLine!NumValue!=%%a"
  9. )
  10. @Rem 处理过程 具体看下面的注释
  11. For /l %%z in (1,1,%NumValue%) do (
  12. @Rem 第一个For循环,循环次数为文本的总行数。
  13. For /l %%a in (1,1,%NumValue%) do (
  14. @Rem 第二个循环,循环次数为文本的总行数,其实是为第一次排序。
  15. For /f "tokens=* delims=." %%b in ("!StrLine%%a!") do Set StrLineNumValueA=%%b
  16. @Rem 找出排序依序值,本例中处理的是C类IP地址。所以取的值为最后一个IP地址.
  17. Set "Var_Stepvalue=%%a"
  18. Set /a Var_Stepvalue+=1
  19. If !Var_Stepvalue! GEQ %NumValue% Set Var_Stepvalue=%NumValue%
  20. @Rem 这个IF只是用来限制判断行数不能超出最大的行数
  21. Echo !Var_Stepvalue! > %Temp%\Temp
  22. @Rem 因批处理没有办法或者说本人还没有发现更好的方法来实现真正的数组,所以只能利用局部变量来代替数组编号。
  23. @Rem 所以将这个位置的值用所需要的值,加1然后输出到一个文本中。方便让下一个For来将其作为局部变量来使用
  24. For /f %%b in (%Temp%\Temp) do (
  25. @Rem 读取所需要的数组代号并赋值于局部变量%%b
  26. For /f "tokens=* delims=." %%b in ("!StrLine%%b!") do Set StrLineNumValueB=%%b
  27. @Rem 提取出于第一个数值做比较的第二个数值
  28. If !StrLineNumValueA! GTR !StrLineNumValueB! (
  29. @Rem 判断第二个数值是否大于第一个数值
  30. Set "StrLineT=!StrLine%%a!"
  31. Set "StrLine%%a=!StrLine%%b!"
  32. Set "StrLine%%b=!StrLineT!"
  33. @Rem 这三个命令其实就是说,如果第二个大于第一个就将两个数组中的数值做一个替换
  34. )
  35. )
  36. )
  37. )
  38. For /l %%a in (1,1,%NumValue%) do (
  39. Echo !StrLine%%a!
  40. )
  41. @Rem 将排序好的数组显示出来
  42. Pause
复制代码

自己做个沙发,个人感觉写的代码还是挺规范的,只是论坛的宽度限制了。所以看着有点乱。
复制出来到Editplus或者Netpad++都可以直接看清楚代码的。

其实两个不通的地方只是第20行 和 第33行中的tokens=参数值,这里上面说清楚了是提取出用来判断的数值。

当然这个用来升序的如果需要降序的话 其实只需要修改 第36行 代码将 GTR 更改为 LSS 即可实现降序了

还有本人在此声明出了批处理中的《全局变量》《局部变量》意义。
Set Var=10
Echo %Var%
此命令中 %Var% 可以称之为全局变量

For /l %%a in (1,1,10) do @Echo %%a
此命令中的%%a就 可以称之为局部变量  因为这个%%a 只能在这个For命令中起到效果。

希望发的这个帖子对学习批处理的朋友会有点帮助。

也希望论坛的达人可以将此代码继续优化。 哈哈

Bye Bye

TOP

本帖最后由 ArdentMan 于 2011-9-9 11:29 编辑

排序有必要写得如此复杂吗?
再说论坛有如此多的排序代码就没有人肯去看看吗?
针对于知道字符最高位数的如楼主所举的ip(3位)排序(不考虑有重复行的情况):
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "tokens=1-4 delims=." %%a In (a.txt) Do Set "Str=000%%d"&Set "_!Str:~-3!=%%a.%%b.%%c.%%d"
  3. (For /F "tokens=2 delims==_" %%a In ('Set _') Do Echo %%a)>b.txt
  4. Start b.txt
复制代码
针对于末知字符最高位数的排序(考虑有重复行的情况,且每行字符数均少于80个):
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /L %%a In (1,1,79) Do Set "Add=!Add!0"
  3. (For /F "delims=" %%a In (a.txt) Do Set "Str=%Add%@%%a"&Echo !Str:~-80!)>$
  4. (For /F "delims=" %%a In ('Sort /r $') Do Set "Str=%%a"&Echo !Str:*@=!)>b.txt
  5. del $&Start b.txt
复制代码
一路飘过的鸟~~~

TOP

返回列表