Board logo

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

作者: batman    时间: 2009-6-6 16:01     标题: 【练习-047】对文本内容按要求排序并计算数值和的批处理

&&有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

一定要按 张三、李四这样的顺序吗? 李四、张三这样应该也可以吧?
另外你的练习应该是 046 了  (^_^)
http://www.bathome.net/viewthread.php?tid=4284&highlight=%A1%BE%C1%B7%CF%B0

[ 本帖最后由 随风 于 2009-6-6 16:41 编辑 ]
作者: batman    时间: 2009-6-6 16:42

原帖由 随风 于 2009-6-6 16:34 发表
一定要按 张三、李四这样的顺序吗? 李四、张三这样应该也可以吧?
另外你的练习应该是 046 了  (^_^)
http://www.bathome.net/viewthread.php?tid=4284&highlight=%A1%BE%C1%B7%CF%B0

呵呵,本题就是要按指定的顺序,不然一个sort不就完事了。
作者: tireless    时间: 2009-6-6 17:20

  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 编辑 ]
作者: batman    时间: 2009-6-6 17:24

楼上的有错误
作者: more    时间: 2009-6-6 17:29

  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
复制代码

作者: batman    时间: 2009-6-6 17:49

给出我的第一种方法(和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
复制代码

作者: curious    时间: 2009-6-6 19:03     标题: 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 编辑 ]
作者: batman    时间: 2009-6-6 19:49

楼上的好像没看清楚题意吧,你的排序在哪里?
作者: curious    时间: 2009-6-6 19:53     标题: try

兄弟:最好把代码运行一下,现在和您的要求完全一样了。
作者: curious    时间: 2009-6-6 19:57

  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
复制代码

作者: zhouyongjun    时间: 2009-6-6 20:20

  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
复制代码

作者: netbenton    时间: 2009-6-6 21:01

  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
复制代码

作者: inittab    时间: 2009-6-7 11:42

  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
复制代码

作者: keen    时间: 2009-6-8 17:22

我的跟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
复制代码

作者: 随风    时间: 2009-6-8 18:03     标题: 回复 15楼 的帖子

对文本进行了多次循环,影响效率,再改改,争取只循环一次 (^_^)
作者: keen    时间: 2009-6-8 18:50     标题: 回复 16楼 的帖子

再改,就跟batman的代码一样了,先对整个文本过一遍把数字全部赋给变量。这样只对文本进行一次循环。
看来最佳答案只能类似batman的了。
作者: dali    时间: 2009-6-10 21:11

  1. @echo off
  2. for %%. in (张三 李四 王五 赵六) do call :ca %%.
  3. start b.txt
  4. exit
  5. :ca
  6. setlocal enabledelayedexpansion
  7. if exist b.txt for /f "tokens=1-3 delims= " %%i in (b.txt) do set n=%%i
  8. for /f "tokens=1-3 delims=: " %%a in ('findstr /n %1 a.txt') do (set/a n+=1&set/a m+=%%c&&>>b.txt echo !n! %1 %%c)
  9. set/a n+=1&&echo !n! 合计 %m% >>b.txt
  10. goto :eof
复制代码

[ 本帖最后由 dali 于 2009-6-10 21:12 编辑 ]
作者: jmz573515    时间: 2009-6-11 21:22

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2 delims= " %%i in (a.txt) do (
  4. if "%%i"=="张三" set /a zs+=%%j && echo %%i %%j>>张三.txt
  5. if "%%i"=="李四" set /a ls+=%%j && echo %%i %%j>>李四.txt
  6. if "%%i"=="王五" set /a ww+=%%j && echo %%i %%j>>王五.txt
  7. if "%%i"=="赵六" set /a zl+=%%j && echo %%i %%j>>赵六.txt
  8. )
  9. echo 合计 !zs!>>张三.txt
  10. echo 合计 !ls!>>李四.txt
  11. echo 合计 !ww!>>王五.txt
  12. echo 合计 !zl!>>赵六.txt
  13. (for /f "delims=" %%i in (张三.txt 李四.txt 王五.txt 赵六.txt) do (
  14. set /a i+=1
  15. echo !i! %%i
  16. ))>b.txt
  17. del 张三.txt 李四.txt 王五.txt 赵六.txt
  18. start b.txt
复制代码

作者: lengmoke    时间: 2021-10-9 17:02

  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. set "str=张三 李四 王五 赵六"
  4. for /f "tokens=1,2" %%i in (a.txt) do ( set "%%i=!%%i! %%j" )
  5. set num=1
  6. for %%i in (%str%) do (
  7.     set sum=0
  8.     for %%j in (!%%i!) do ( echo !num!   %%i        %%j>>b.txt & set /a num+=1 & set /a sum+=%%j )
  9.     echo !num!   总计        !sum!>>b.txt & set /a num+=1
  10. )
复制代码

作者: Fit    时间: 2021-10-10 15:36

@echo off&setlocal enabledelayedexpansion
(for %%a in (张三 李四 王五 赵六) do (
   set /a sum=0
   set /a cout=0
   for /f "tokens=1,2 delims= " %%i in (a.txt) do (
      if "%%i"=="%%a" (
      set /a cout+=1
      echo !cout!        %%i        %%j
      set /a sum+=%%j)
   )
set /a cout+=1
echo,!cout!        合计        !sum!
))>b.txt
pause




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2