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

[文本处理] 求助:请帮忙解释下数字按降序排列批处理代码全部构成及SET用法

[复制链接]
发表于 2014-12-24 10:49:16 | 显示全部楼层 |阅读模式
~不理解为什么这段代码能把一个文本里面的数字按降序排列
怎么做到的,求大神解释下里面代码的具体意义和 set _ 使用
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,80) do set "kong=!kong!#"

  3.   for /f %%i in (c:\1.txt) do (
  4.     set "str=%%i%kong%"
  5.     set "a=!str:~,80!"
  6.     set "a=!a:%%i=!"
  7.     set "_!a!%%i=a"
  8.                                          )
  9.   for /f "delims==_" %%i in ('set _') do (
  10.     set "str=%%i"
  11.     echo !str:#=!
  12.                                         )
  13. pause
复制代码
发表于 2014-12-24 12:47:41 | 显示全部楼层
有点意思,巧妙利用了set操作的按序排列变量的功能。
发表于 2014-12-24 13:11:50 | 显示全部楼层
本帖最后由 shelluserwlb 于 2014-12-24 13:27 编辑

这段代码首先设置了一个具有80个井号的kong变量,然后再利用这个kong给每行字符串都生成一个诸如 _###1254585这个的变量(这些变量的值相同(=a),变量名的总长度也相同)。然后利用set命令的特点显示输出所有开头包含_的变量名。
发表于 2014-12-24 13:39:59 | 显示全部楼层
文档中若含有_则无法显示完全。
并且某些行并没有被输出,其实我没看懂他这样写的目的 >_<
一连用了那么多set,给个注释也好啊。。。
发表于 2014-12-24 14:00:58 | 显示全部楼层
本帖最后由 shelluserwlb 于 2014-12-24 14:10 编辑

第1个for /f   
1.取出文件中的一行(%%i)与kong变量合并生成变量str
2.截取str变量的前80个字符生成变量a
3.删除变量a中的%%i(a中只剩下 若干个#号)
4.将_和a变量和%%i的内容组合变量名并赋值为a   
这段代码执行完毕后,就会生成20个(假如文本有20行)如 _###2525.....252、 _#####969...1544这样的变量,这些变量的变量名长度都相同,且值也相同。
后面就是输出,相信大家都看得懂。
以下是要求按每行数据从小到大进行排序输出的txt文件:
2928326128601232462131283250710027308938740594716691200992050511576
5352129649530193383124730478244772348721985707222557212265817305
217141333532296179938475175265792931789219830308392472584606305
2371620291160322081050531817416284225477019123161801285941026814244
283929972304551060318886921731765136928849135391662294051194618754
1809165929787147057932949630411324311737224509104016550662932273
27396236084901303873154718299242931819623155304661177528921164510335
254221462410491137971033914630292752245114969186002809930190939425
1085287492160525651862932475207612387312368408826675135332406418337
2567810118246621010283281198810903279355871571118961177731143829148
23727111515524141721964179351992331180134926914198081871053303186
378579502856625703213542353218420835730692264021219729654278515442
30215186011014395001656818458819061824708536511543271701327524725
223702764213159156022932717903282522044350522584222768193271431422354
3079720530119542370417125702274761144023302102641160114921224469221
15642298214000242538839193816839550322381321993212316517861828002
13042178002978222022331319116624809338275899045263351248023569
11252165681825711849278422768716060438517976169102391532289954712000
105084292396529699311371735329685626410510259482788519645152723476
29674179062831103792824121564178225289202161443911094228581583531951
发表于 2014-12-24 14:34:27 | 显示全部楼层
回复 5# shelluserwlb


第一个for认真套取的话还是能看懂的,原来想不懂,他是怎么用来输出的,刚刚测试了一下,没想到for /f 能够直接提取 "set  _"
中 以_开头的变量名其中的数据,还是第一次看到这种写法。
 楼主| 发表于 2014-12-24 16:23:25 | 显示全部楼层
回复 2# yiwuyun


    set操作的按序排列变量 求指点!
 楼主| 发表于 2014-12-24 16:25:06 | 显示全部楼层
回复 3# shelluserwlb


    "然后利用set命令的特点显示输出所有开头包含_的变量名。"
    求大神指点 “set命令的特点” 和 set _ 的具体含义
 楼主| 发表于 2014-12-24 16:30:11 | 显示全部楼层
回复 5# shelluserwlb


    求大神: 指点 “set _”的这样的写法,还有为什么能排序,上面的高手说是 SET的特性 求解释
发表于 2014-12-24 19:17:50 | 显示全部楼层
本帖最后由 shelluserwlb 于 2014-12-24 19:53 编辑
  1. @echo off
  2. set "_**25-23=th"
  3. set "_**45*87=th"
  4. set "_***6538=th"
  5. set "_**908#7=th"
  6. set "_**11-23=th"
  7. set "_**858+6=th"
  8. set "_****4*5=th"
  9. set "_***1238=th"
  10. set _
  11. pause
复制代码
如上述代码 (所有变量的变量名长度均相同,值也相同):以变量名的第1个字符的数量进行排序(星号越多显示越靠前),当第一个字符的数量相同时再以第二字符进行比较,...以此类推. 而当遇到数字比较时,它会对连续的数值进行比较(数值越小显示越靠前)。  
所以上述代码运行的结果是:
_****4*5=th
_***1238=th
_***6538=th
_**11-23=th
_**25-23=th
_**45*87=th
_**458+6=th
_**908#7=th
请按任意键继续......
发表于 2014-12-24 21:55:43 | 显示全部楼层
回复 10# shelluserwlb


以变量名的第1个字符的数量进行排序

这个说法不是很严谨,它无法解释为什么2个#排在5个*前面。
  1. @echo off
  2. set "_##12345=th"
  3. set "_**25-23=th"
  4. set "_**45*87=th"
  5. set "_***6538=th"
  6. set "_**908#7=th"
  7. set "_**11-23=th"
  8. set "_**858+6=th"
  9. set "_****4*5=th"
  10. set "_***1238=th"
  11. set _
  12. pause
复制代码
 楼主| 发表于 2014-12-25 09:36:39 | 显示全部楼层
回复 10# shelluserwlb


   
    嗯~ 首先感谢亲的回复,非常感激,然后就是像管理员说的那样,如果是按亲说的那样,按字符长度(长度越长)越优先排列,
是无法解释2个# 和 5个* 为什么2个# 排在 5个* 前面的,但是如果是同一种字符的话,亲的说法就说得通,但是如果多个变量中
参杂的字符不一样的话,结果就会出错!
发表于 2014-12-25 10:19:13 | 显示全部楼层
回复 12# rdctgvf


    是按照ASCII排序的
 楼主| 发表于 2014-12-25 11:28:39 | 显示全部楼层
回复 13# DAIC


感谢亲的指导。刚刚去尝试了,果然是按ASCII排序的,声明的变量名称中,同长度,不同字符的情况下,优先字符对应

的ASCII十进制值排序,然后就是不同长度,单一且同一种字符相同的情况下,字符长度越小的优先级越高 (升序排列)

但是我发现一个问题,就是在单一且同一种字符相同的情况下在变量末尾加入1-9个数字中任意的一个数字,就变成按长度越长的优先排列了 (降序排列)

很神奇 - -!
发表于 2014-12-25 12:53:41 | 显示全部楼层
本帖最后由 shelluserwlb 于 2014-12-25 13:06 编辑

回复 14# rdctgvf
批处理果然很神奇,但就set这一个命令就够我们讨论研究半天的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 00:25 , Processed in 0.020364 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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