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

[文本处理] 【练习-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 编辑 ]
***共同提高***

@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
Fit Strong

TOP

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

TOP

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

评分人数

TOP

  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 编辑 ]
1

评分人数

    • batman: 效率,还是效率问题!PB + 5

TOP

回复 16楼 的帖子

再改,就跟batman的代码一样了,先对整个文本过一遍把数字全部赋给变量。这样只对文本进行一次循环。
看来最佳答案只能类似batman的了。
(*^_^*)

TOP

回复 15楼 的帖子

对文本进行了多次循环,影响效率,再改改,争取只循环一次 (^_^)
技术问题请到论坛发帖求助!

TOP

我的跟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
复制代码
(*^_^*)

TOP

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

评分人数

TOP

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

TOP

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

评分人数

    • batman: 这也就是第二种方法PB + 15

TOP

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

TOP

try

兄弟:最好把代码运行一下,现在和您的要求完全一样了。

TOP

楼上的好像没看清楚题意吧,你的排序在哪里?
***共同提高***

TOP

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 编辑 ]

TOP

返回列表