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

[文本处理] 批处理如何从表格中提取指定行和按指定条件进行排序?

本帖最后由 pcl_test 于 2016-8-19 18:40 编辑

批处理如何在表格中提取指定行?
例如
姓名         武力         智力         体力         统御         潜力总分
刘禅         0.8        0.35        0.9        0.45        2.5
韩玄         0.95        0.5        0.85        0.25        2.55
赵范         0.85        0.95        0.6        0.15        2.55
金旋         0.9        0.6        0.75        0.3        2.55
李氏         1.1        0.85        0.4        0.25        2.6
王朗         0.6        1.1        0.5        0.4        2.6
马邈         1        0.65        0.75        0.2        2.6
张鲁         0.6        1.05        0.7        0.25        2.6
王忠         0.95        0.6        0.75        0.35        2.65
袁熙         0.9        0.8        0.65        0.3        2.65
公孙越         0.95        0.85        0.55        0.3        2.65
要求第一个批处理 可以输入名字得到武将数据
   第二个批处理 可以以一项值(比如武力)的高低排列排列武将
   第三个批处理可以以两个或者三个的和(体质加统御)的高低排列武将

[ 本帖最后由 cuixiaojun130 于 2010-7-24 10:57 编辑 ]

方法:利用sort排序,一个小vbs来对多个小数求和。
不足之处:
①对不带小数点的数排行可能出现错误,如果在脚本中处理数据会显得麻烦,所以请楼主在整数后加上小数点。(我观察列表中的整数并不多)
②由于cmd不能计算小数,所以在计算综合分数时无奈用上了VBS,这造成第三项工作效率低,并且生成临时文件。
请将被处理文本命名为 武将信息.txt ,以下是测试过的脚本:
  1. @echo off&setlocal enabledelayedexpansion
  2. ::code by wankoilz from bbs.bathome.net 2010/7/24
  3. (
  4. echo Set objArgs = WScript.Arguments
  5. echo For i = 0 to objArgs.Count - 1
  6. echo    x=x+cDbl^(objArgs^(i^)^)
  7. echo Next
  8. echo wscript.echo x
  9. )>a.vbs
  10. :main
  11. cls
  12. set 武力=2&set 智力=3&set 体力=4&set 统御=5&set 潜力总分=6
  13. echo 1-------获取武将数据
  14. echo 2-------武将能力排行
  15. echo 3-------武将综合能力排行
  16. echo 4-------退出
  17. set/p p=选择:
  18. goto :%p%
  19. :1
  20. setlocal
  21. cls
  22. echo 单个武将信息查询
  23. echo.
  24. set/p name=请输入武将姓名:
  25. echo 姓名         武力        智力       体力       统御       潜力总分
  26. findstr /r /c:"\<%name%\>" 武将信息.txt 2>nul||echo 列表中没有你要查询的武将信息。
  27. pause>nul
  28. endlocal&goto :main
  29. :2
  30. setlocal
  31. cls
  32. set/p 能力=请输入要进行排行的能力:
  33. cls
  34. echo %能力%排行:
  35. echo 姓名         武力         智力         体力         统御         潜力总分
  36. set x=!%能力%!
  37. for /f "skip=1 tokens=1-6" %%1 in (武将信息.txt) do set "_%%%x% !random!!random!!random!!random!=%%1          %%2          %%3           %%4          %%5          %%6"
  38. for /f "tokens=2 delims==" %%i in ('set _^|sort') do echo %%i
  39. pause>nul
  40. endlocal&goto :main
  41. :3
  42. setlocal
  43. cls
  44. :loop
  45. set/a n+=1
  46. set/p 能力%n%=请输入要综合的第%n%项能力[直接回车结束]:
  47. if "!能力%n%!"=="" goto :next
  48. goto :loop
  49. :next
  50. echo 处理中...
  51. set/a n-=1
  52. for /l %%i in (1,1,%n%) do call set str=!str!%%!能力%%i!%%,
  53. for /f "skip=1 tokens=1,%str:~0,-1%" %%1 in (武将信息.txt) do (
  54.      set "args=%%2 %%3 %%4 %%5 %%6"
  55.      set/a x=^(5-!n!^)*3
  56.      set/a t=1/x 2>nul&&for %%i in (!x!) do set "args=!args:~0,-%%i!"
  57.      for /f %%i in ('cscript /nologo a.vbs !args!') do set "_%%i !random!!random!!random!!random!=%%1                 %%i"
  58. )
  59. cls
  60. for /l %%i in (1,1,%n%) do set s=!s!!能力%%i!+
  61. echo !s:~0,-1!  %n%项综合能力排行:
  62. echo.
  63. echo 姓名                 综合能力分数
  64. for /f "tokens=2 delims==" %%i in ('set _^|sort') do echo %%i
  65. pause>nul
  66. endlocal&goto :main
  67. :4
  68. del a.vbs
  69. exit
复制代码

[ 本帖最后由 wankoilz 于 2010-7-25 14:04 编辑 ]

TOP

数值中整数部分最多几位?小数部分最多几位?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 3楼 的帖子

整数最多一位 小数最多两位

TOP

回复 2楼 的帖子

第一 二两个可用
第三个好像用不了

TOP

回复 2楼 的帖子

是这个样子的
都是9啊
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p var=<a.txt
  3. set xm=a 武力 智力 体力 统御 潜力总分
  4. for %%a in (%xm%) do (
  5.    set /a min+=1
  6.    set /a %%a=min
  7. )
  8. :start
  9. setlocal&set "x="
  10. echo;&echo;直接输入名字得到武将数据
  11. echo;&echo;输入2加一项值则按该值排序,如输入:2武力
  12. echo;&echo;输入2加多项值则按这些项的值的和排序,注意用空格分开
  13. echo;如输入:2武力 体力  统御
  14. echo;&set /p x=
  15. cls
  16. if "%x:~0,1%"=="2" goto loop
  17. for /f "tokens=1* delims= " %%a in (a.txt) do (
  18.    if not defined flag echo %%a %%b
  19.    if "%%a"=="%x%" echo %%a %%b
  20.    set flag=a
  21. )
  22. endlocal
  23. goto start
  24. :loop
  25. set m=&set "x=%x:~1%"
  26. for %%a in (%x%) do set .!%%a!=a
  27. (for /f "skip=1 delims=" %%i in (a.txt) do (
  28.    set /a n=0
  29.    for %%j in (%%i) do (
  30.        set /a n+=1
  31.        set num=1%%j00
  32.        set num=!num:.=!
  33.        set num=!num:~0,4!
  34.        if defined .!n! set str=!str!+!num!
  35.     )
  36.     set /a str=0!str!
  37.     echo !str! %%i
  38.     set "str="
  39. ))>tem
  40. echo;按 %x% 排序
  41. echo %var%
  42. for /f "tokens=1* delims= " %%a in ('sort tem') do echo %%b
  43. echo;&echo;&endlocal
  44. goto start
复制代码
2

评分人数

技术问题请到论坛发帖求助!

TOP

经楼主提醒,修改了存在的问题,能达到楼主目的。
其中又发现两个事情:
①:
  1. Set objArgs = WScript.Arguments
  2. For i = 0 to objArgs.Count - 1
  3.       x=x+cDbl(objArgs(i))
  4. Next
  5. wscript.echo x
复制代码
当x的值是小数的时候,小数点前面的0没有了,显示出如".3"的形式,不知为什么.
②%str:~0,-0%这种格式的变量截取是非法的,得到的结果是“空”。

看了楼上的代码才知道什么叫精炼!PF
请教楼上:
为什么 set /a str=0!str! 要加0呢?

[ 本帖最后由 wankoilz 于 2010-7-25 14:42 编辑 ]

TOP

回复 8楼 的帖子

匆忙发的帖,代码未作进一步优化
为什么 set /a str=0!str! 要加0呢?
是因为 set str=!str!+!num! 在str前面多了个+号,
实际把此句改为 set /a str+=!num! 会更简洁,可以省略 set /a str=0!str!
当然别忘了要在前面把str的值归零 set /a n=0,str=0

7楼代码也可以不用临时文件tem ,而用变量来代替,楼上有兴趣可以试试 ^_^
记得要考虑数值相同时的情况哦~

[ 本帖最后由 随风 于 2010-7-25 19:01 编辑 ]
技术问题请到论坛发帖求助!

TOP

回复 9楼 的帖子

谢谢!
原帖由 随风 于 2010-7-25 18:37 发表
匆忙发的帖,代码未作进一步优化
为什么 set /a str=0!str! 要加0呢?
是因为 set str=!str!+!num! 在str前面多了个+号,
实际把此句改为 set /a str+=!num! 会更简洁,可以省略 set /a str=0!str!
当然别忘了 ...

虽说如此,我还是觉得你用的先构造出表达式!str! ,后再直接套在set/a里这招更妙。
至于说修改,你是说这样么:
  1.     set "_!str! !random!!random!!random!=%%i"   rem 修改点
  2.     set "str="
  3. ))                rem  修改点
  4. echo;按 %x% 排序
  5. echo %var%
  6. for /f "tokens=1* delims==" %%a in ('set _^|sort') do echo %%b  rem 修改点
  7. echo;&echo;&endlocal
  8. goto start
复制代码
不过看了你的代码我才知道 sort+文件名 这种用法。

[ 本帖最后由 wankoilz 于 2010-7-25 19:24 编辑 ]

TOP

返回列表