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

[文本处理] 【练习-047】对文本内容按要求排序并计算数值和的批处理

[复制链接]
发表于 2009-6-6 16:01:43 | 显示全部楼层 |阅读模式
&&有a.txt,内容如下:
  1. 张三        33
  2. 李四        32
  3. 李四        62
  4. 赵六        91
  5. 赵六        64
  6. 张三        35
  7. 王五        82
  8. 张三        52
  9. 王五        66
  10. 张三        42
  11. 李四        78
  12. 张三        75
  13. 李四        21
  14. 王五        53
  15. 赵六        78
  16. 张三        85
  17. 李四        96
  18. 王五        87
  19. 张三        8
  20. 李四        13
  21. 李四        32
  22. 张三        13
  23. 赵六        30
  24. 王五        0
  25. 王五        18
  26. 赵六        66
  27. 王五        54
复制代码
  要求用批处理将文本按张三、李四、王五、赵六的顺序进行排序,并计算各人的数值和,同时在前面加上行号,生成b.txt如下:
  1. 1        张三        33
  2. 2        张三        35
  3. 3        张三        52
  4. 4        张三        42
  5. 5        张三        75
  6. 6        张三        85
  7. 7        张三        8
  8. 8        张三        13
  9. 9        合计        343
  10. 10        李四        32
  11. 11        李四        62
  12. 12        李四        78
  13. 13        李四        21
  14. 14        李四        96
  15. 15        李四        13
  16. 16        李四        32
  17. 17        合计        334
  18. 18        王五        82
  19. 19        王五        66
  20. 20        王五        53
  21. 21        王五        87
  22. 22        王五        0
  23. 23        王五        18
  24. 24        王五        54
  25. 25        合计        360
  26. 26        赵六        91
  27. 27        赵六        64
  28. 28        赵六        78
  29. 29        赵六        30
  30. 30        赵六        66
  31. 31        合计        329
复制代码
  本题满分15分,视情况加分,以思路为重(请版主们暂不解答)

[ 本帖最后由 batman 于 2009-6-24 17:37 编辑 ]
发表于 2009-6-6 16:34:24 | 显示全部楼层
一定要按 张三、李四这样的顺序吗? 李四、张三这样应该也可以吧?
另外你的练习应该是 046 了  (^_^)
http://www.bathome.net/viewthread.php?tid=4284&highlight=%A1%BE%C1%B7%CF%B0

[ 本帖最后由 随风 于 2009-6-6 16:41 编辑 ]
 楼主| 发表于 2009-6-6 16:42:14 | 显示全部楼层
原帖由 随风 于 2009-6-6 16:34 发表
一定要按 张三、李四这样的顺序吗? 李四、张三这样应该也可以吧?
另外你的练习应该是 046 了  (^_^)
http://www.bathome.net/viewthread.php?tid=4284&highlight=%A1%BE%C1%B7%CF%B0

呵呵,本题就是要按指定的顺序,不然一个sort不就完事了。
发表于 2009-6-6 17:20:26 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%a in (a.txt) do set %%a=!%%a!,%%b
  3. set n=1
  4. (for %%? in (张三 李四 王五 赵六) do (
  5.   for %%a in (!%%?!) do (
  6.     echo !n!        %%?        %%a
  7.     set /a n+=1,%%?+=%%a
  8.   )
  9.   echo !n!        合计        !%%?!
  10. ))>b.txt
复制代码

[ 本帖最后由 tireless 于 2009-6-6 17:37 编辑 ]
 楼主| 发表于 2009-6-6 17:24:32 | 显示全部楼层
楼上的有错误
发表于 2009-6-6 17:29:04 | 显示全部楼层
  1. @echo off&Setlocal Enabledelayedexpansion
  2. for %%a in (张三 李四 王五 赵六) do (
  3.    set num=0
  4.    for /f "tokens=1,2" %%i in ('type a.txt') do (
  5.       if /i "%%a"=="%%i" (
  6.          set /a n+=1,num+=%%j
  7.          echo.!n!   %%i   %%j
  8.       )
  9.    )
  10.    set /a n+=1
  11.    echo.!n!   合计   !num!
  12. )
  13. echo.&pause
复制代码

评分

参与人数 1PB +8 收起 理由
batman + 8 效率是个大问题

查看全部评分

 楼主| 发表于 2009-6-6 17:49:15 | 显示全部楼层
给出我的第一种方法(和tireless思路一样):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%a in (a.txt) do set "_%%a=!_%%a! %%b"
  3. for %%a in (张三 李四 王五 赵六) do (
  4.      for %%b in (!_%%a!) do set /a num+=%%b,n+=1&echo !n! %%a %%b>>b.txt
  5.      set /a n+=1&echo !n! 合计 !num!>>b.txt&set /a num=0
  6. )      
  7. start b.txt
复制代码
发表于 2009-6-6 19:03:27 | 显示全部楼层

try


  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-2 delims= " %%i in (1.txt) do (
  4. set /a num1+=1
  5. if !num1! lss 10 (set num=000!num1!) else (
  6. if !num1! lss 100 (set num=00!num1!) else (
  7.   if !num1! lss 1000 (set num=0!num1!)
  8. )
  9. )
  10. set  #%%i_!num!=%%j
  11. )
  12. for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
  13. set /a #%%i_a+=%%k
  14. )
  15. for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
  16. set /a n+=1
  17. if "%%j" equ "a" (echo  !n! 合计 %%k) else (echo  !n! %%i %%k)
  18. )
  19. pause>nul

复制代码

[ 本帖最后由 curious 于 2009-6-6 19:47 编辑 ]
 楼主| 发表于 2009-6-6 19:49:22 | 显示全部楼层
楼上的好像没看清楚题意吧,你的排序在哪里?
发表于 2009-6-6 19:53:46 | 显示全部楼层

try

兄弟:最好把代码运行一下,现在和您的要求完全一样了。
发表于 2009-6-6 19:57:40 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::构建变量
  4. for /f "tokens=1-2 delims= " %%i in (1.txt) do (
  5. set /a num1+=1
  6. if !num1! lss 10 (set num=000!num1!) else (
  7. if !num1! lss 100 (set num=00!num1!) else (
  8.   if !num1! lss 1000 (set num=0!num1!)
  9. )
  10. )
  11. set  #%%i_!num!=%%j
  12. )
  13. ::求和
  14. for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
  15. set /a #%%i_a+=%%k
  16. )
  17. ::输出
  18. for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
  19. set /a n+=1
  20. if "%%j" equ "a" (echo  !n! 合计 %%k) else (echo  !n! %%i %%k)
  21. )
  22. pause>nul
复制代码
发表于 2009-6-6 20:20:07 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. (for %%i in (张三 李四 王五 赵六) do (
  3.     for /f "tokens=1,2" %%a in ('findstr "%%i" "a.txt"') do (
  4.         set/a n+=1,sn+=%%b
  5.         echo !n!        %%a        %%b
  6.     )
  7.     set/a n+=1 &echo !n!        合计        !sn!
  8.     set/a sn=0
  9. ))>b.txt
复制代码

评分

参与人数 1PB +15 收起 理由
batman + 15 这也就是第二种方法

查看全部评分

发表于 2009-6-6 21:01:23 | 显示全部楼层

  1. @echo off&setlocal enabledelayedexpansion
  2. if defined 张三 goto :skip
  3. for %%a in (张三 李四 王五 赵六) do (set/a n+=1&set %%a=!n!)
  4. set ver=
  5. set/a 合计=0,n=1
  6. (for %%a "tokens=2,3" in ('%0^|sort') do (
  7.     set /a 合计+=%%b
  8.     if defined ver if !ver! neq %%a echo !n! 合计 !合计!&set/a n+=1&set/a 合计=0
  9.     echo !n! %%a %%b
  10.     set ver=%%a
  11.     set/a n+=1
  12. )
  13. echo !n! 合计 !合计!)>b.txt
  14. start b.txt
  15. exit/b

  16. :skip
  17. for /f "tokens=1,2" %%a in (a.txt) do echo !%%a! %%a %%b
  18. goto :eof
复制代码
发表于 2009-6-7 11:42:10 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%a in (a.txt) do set "%%a=!%%a! %%b"&set/a .%%a+=%%b
  3. set n=0
  4. for %%a in (张三 李四 王五 赵六) do (
  5. for %%b in (!%%a!) do set/a n+=1&echo !n!        %%a        %%b
  6. set/a n+=1
  7. echo !n!        合计        !.%%a!
  8. )
  9. pause
复制代码

评分

参与人数 1PB +10 收起 理由
netbenton + 10 用得很巧秒呀

查看全部评分

发表于 2009-6-8 17:22:34 | 显示全部楼层
我的跟6楼的一样,但是6楼因为使用了echo. 所以效率有点低。
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (张三 李四 王五 赵六) do (
  3.     set sum=0
  4.     for /f "tokens=1,2" %%a in (a.txt) do (
  5.         if "%%i" equ "%%a" (
  6.             set /a n+=1
  7.             set /a sum+=%%b
  8.             echo !n!        %%a        %%b
  9. )
  10. )
  11. set /a n+=1
  12. echo !n!        合计        !sum!
  13. )
  14. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 04:24 , Processed in 0.024978 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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