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