![Board logo](images/default/logo.gif)
标题: [文本处理] 批处理如何从表格中提取指定行和按指定条件进行排序? [打印本页]
作者: cuixiaojun130 时间: 2010-7-24 06:55 标题: 批处理如何从表格中提取指定行和按指定条件进行排序?
本帖最后由 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 编辑 ]
作者: wankoilz 时间: 2010-7-24 15:29
方法:利用sort排序,一个小vbs来对多个小数求和。
不足之处:
①对不带小数点的数排行可能出现错误,如果在脚本中处理数据会显得麻烦,所以请楼主在整数后加上小数点。(我观察列表中的整数并不多)
②由于cmd不能计算小数,所以在计算综合分数时无奈用上了VBS,这造成第三项工作效率低,并且生成临时文件。
请将被处理文本命名为 武将信息.txt ,以下是测试过的脚本:- @echo off&setlocal enabledelayedexpansion
- ::code by wankoilz from bbs.bathome.net 2010/7/24
- (
- echo Set objArgs = WScript.Arguments
- echo For i = 0 to objArgs.Count - 1
- echo x=x+cDbl^(objArgs^(i^)^)
- echo Next
- echo wscript.echo x
- )>a.vbs
- :main
- cls
- set 武力=2&set 智力=3&set 体力=4&set 统御=5&set 潜力总分=6
- echo 1-------获取武将数据
- echo 2-------武将能力排行
- echo 3-------武将综合能力排行
- echo 4-------退出
- set/p p=选择:
- goto :%p%
- :1
- setlocal
- cls
- echo 单个武将信息查询
- echo.
- set/p name=请输入武将姓名:
- echo 姓名 武力 智力 体力 统御 潜力总分
- findstr /r /c:"\<%name%\>" 武将信息.txt 2>nul||echo 列表中没有你要查询的武将信息。
- pause>nul
- endlocal&goto :main
- :2
- setlocal
- cls
- set/p 能力=请输入要进行排行的能力:
- cls
- echo %能力%排行:
- echo 姓名 武力 智力 体力 统御 潜力总分
- set x=!%能力%!
- for /f "skip=1 tokens=1-6" %%1 in (武将信息.txt) do set "_%%%x% !random!!random!!random!!random!=%%1 %%2 %%3 %%4 %%5 %%6"
- for /f "tokens=2 delims==" %%i in ('set _^|sort') do echo %%i
- pause>nul
- endlocal&goto :main
- :3
- setlocal
- cls
- :loop
- set/a n+=1
- set/p 能力%n%=请输入要综合的第%n%项能力[直接回车结束]:
- if "!能力%n%!"=="" goto :next
- goto :loop
- :next
- echo 处理中...
- set/a n-=1
- for /l %%i in (1,1,%n%) do call set str=!str!%%!能力%%i!%%,
- for /f "skip=1 tokens=1,%str:~0,-1%" %%1 in (武将信息.txt) do (
- set "args=%%2 %%3 %%4 %%5 %%6"
- set/a x=^(5-!n!^)*3
- set/a t=1/x 2>nul&&for %%i in (!x!) do set "args=!args:~0,-%%i!"
- for /f %%i in ('cscript /nologo a.vbs !args!') do set "_%%i !random!!random!!random!!random!=%%1 %%i"
- )
- cls
- for /l %%i in (1,1,%n%) do set s=!s!!能力%%i!+
- echo !s:~0,-1! %n%项综合能力排行:
- echo.
- echo 姓名 综合能力分数
- for /f "tokens=2 delims==" %%i in ('set _^|sort') do echo %%i
- pause>nul
- endlocal&goto :main
- :4
- del a.vbs
- exit
复制代码
[ 本帖最后由 wankoilz 于 2010-7-25 14:04 编辑 ]
作者: namejm 时间: 2010-7-24 23:19
数值中整数部分最多几位?小数部分最多几位?
作者: cuixiaojun130 时间: 2010-7-25 02:38 标题: 回复 3楼 的帖子
整数最多一位 小数最多两位
作者: cuixiaojun130 时间: 2010-7-25 02:39 标题: 回复 2楼 的帖子
第一 二两个可用
第三个好像用不了
作者: cuixiaojun130 时间: 2010-7-25 03:00 标题: 回复 2楼 的帖子
是这个样子的
都是9啊
作者: 随风 时间: 2010-7-25 11:59
- @echo off&setlocal enabledelayedexpansion
- set /p var=<a.txt
- set xm=a 武力 智力 体力 统御 潜力总分
- for %%a in (%xm%) do (
- set /a min+=1
- set /a %%a=min
- )
- :start
- setlocal&set "x="
- echo;&echo;直接输入名字得到武将数据
- echo;&echo;输入2加一项值则按该值排序,如输入:2武力
- echo;&echo;输入2加多项值则按这些项的值的和排序,注意用空格分开
- echo;如输入:2武力 体力 统御
- echo;&set /p x=
- cls
- if "%x:~0,1%"=="2" goto loop
-
- for /f "tokens=1* delims= " %%a in (a.txt) do (
- if not defined flag echo %%a %%b
- if "%%a"=="%x%" echo %%a %%b
- set flag=a
- )
- endlocal
- goto start
-
- :loop
- set m=&set "x=%x:~1%"
- for %%a in (%x%) do set .!%%a!=a
- (for /f "skip=1 delims=" %%i in (a.txt) do (
- set /a n=0
- for %%j in (%%i) do (
- set /a n+=1
- set num=1%%j00
- set num=!num:.=!
- set num=!num:~0,4!
- if defined .!n! set str=!str!+!num!
- )
- set /a str=0!str!
- echo !str! %%i
- set "str="
- ))>tem
-
- echo;按 %x% 排序
- echo %var%
- for /f "tokens=1* delims= " %%a in ('sort tem') do echo %%b
- echo;&echo;&endlocal
- goto start
复制代码
作者: wankoilz 时间: 2010-7-25 14:25
经楼主提醒,修改了存在的问题,能达到楼主目的。
其中又发现两个事情:
①:- Set objArgs = WScript.Arguments
- For i = 0 to objArgs.Count - 1
- x=x+cDbl(objArgs(i))
- Next
- wscript.echo x
复制代码
当x的值是小数的时候,小数点前面的0没有了,显示出如".3"的形式,不知为什么.
②%str:~0,-0%这种格式的变量截取是非法的,得到的结果是“空”。
看了楼上的代码才知道什么叫精炼!PF
请教楼上:
为什么 set /a str=0!str! 要加0呢?
[ 本帖最后由 wankoilz 于 2010-7-25 14:42 编辑 ]
作者: 随风 时间: 2010-7-25 18:37 标题: 回复 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 编辑 ]
作者: wankoilz 时间: 2010-7-25 19:07 标题: 回复 9楼 的帖子
谢谢!
原帖由 随风 于 2010-7-25 18:37 发表 ![](http://bbs.bathome.net/images/common/back.gif)
匆忙发的帖,代码未作进一步优化
为什么 set /a str=0!str! 要加0呢?
是因为 set str=!str!+!num! 在str前面多了个+号,
实际把此句改为 set /a str+=!num! 会更简洁,可以省略 set /a str=0!str!
当然别忘了 ...
虽说如此,我还是觉得你用的先构造出表达式!str! ,后再直接套在set/a里这招更妙。
至于说修改,你是说这样么:- set "_!str! !random!!random!!random!=%%i" rem 修改点
- set "str="
- )) rem 修改点
- echo;按 %x% 排序
- echo %var%
- for /f "tokens=1* delims==" %%a in ('set _^|sort') do echo %%b rem 修改点
- echo;&echo;&endlocal
- goto start
复制代码
不过看了你的代码我才知道 sort+文件名 这种用法。
[ 本帖最后由 wankoilz 于 2010-7-25 19:24 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |