标题: [文本处理] 【练习-047】对文本内容按要求排序并计算数值和的批处理 [打印本页]
作者: batman 时间: 2009-6-6 16:01 标题: 【练习-047】对文本内容按要求排序并计算数值和的批处理
&&有a.txt,内容如下:- 张三 33
- 李四 32
- 李四 62
- 赵六 91
- 赵六 64
- 张三 35
- 王五 82
- 张三 52
- 王五 66
- 张三 42
- 李四 78
- 张三 75
- 李四 21
- 王五 53
- 赵六 78
- 张三 85
- 李四 96
- 王五 87
- 张三 8
- 李四 13
- 李四 32
- 张三 13
- 赵六 30
- 王五 0
- 王五 18
- 赵六 66
- 王五 54
复制代码
要求用批处理将文本按张三、李四、王五、赵六的顺序进行排序,并计算各人的数值和,同时在前面加上行号,生成b.txt如下:- 1 张三 33
- 2 张三 35
- 3 张三 52
- 4 张三 42
- 5 张三 75
- 6 张三 85
- 7 张三 8
- 8 张三 13
- 9 合计 343
- 10 李四 32
- 11 李四 62
- 12 李四 78
- 13 李四 21
- 14 李四 96
- 15 李四 13
- 16 李四 32
- 17 合计 334
- 18 王五 82
- 19 王五 66
- 20 王五 53
- 21 王五 87
- 22 王五 0
- 23 王五 18
- 24 王五 54
- 25 合计 360
- 26 赵六 91
- 27 赵六 64
- 28 赵六 78
- 29 赵六 30
- 30 赵六 66
- 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
呵呵,本题就是要按指定的顺序,不然一个sort不就完事了。
作者: tireless 时间: 2009-6-6 17:20
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2" %%a in (a.txt) do set %%a=!%%a!,%%b
- set n=1
- (for %%? in (张三 李四 王五 赵六) do (
- for %%a in (!%%?!) do (
- echo !n! %%? %%a
- set /a n+=1,%%?+=%%a
- )
- echo !n! 合计 !%%?!
- ))>b.txt
复制代码
[ 本帖最后由 tireless 于 2009-6-6 17:37 编辑 ]
作者: batman 时间: 2009-6-6 17:24
楼上的有错误
作者: more 时间: 2009-6-6 17:29
- @echo off&Setlocal Enabledelayedexpansion
- for %%a in (张三 李四 王五 赵六) do (
- set num=0
- for /f "tokens=1,2" %%i in ('type a.txt') do (
- if /i "%%a"=="%%i" (
- set /a n+=1,num+=%%j
- echo.!n! %%i %%j
- )
- )
- set /a n+=1
- echo.!n! 合计 !num!
- )
- echo.&pause
复制代码
作者: batman 时间: 2009-6-6 17:49
给出我的第一种方法(和tireless思路一样):- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2" %%a in (a.txt) do set "_%%a=!_%%a! %%b"
- for %%a in (张三 李四 王五 赵六) do (
- for %%b in (!_%%a!) do set /a num+=%%b,n+=1&echo !n! %%a %%b>>b.txt
- set /a n+=1&echo !n! 合计 !num!>>b.txt&set /a num=0
- )
- start b.txt
复制代码
作者: curious 时间: 2009-6-6 19:03 标题: try
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1-2 delims= " %%i in (1.txt) do (
- set /a num1+=1
- if !num1! lss 10 (set num=000!num1!) else (
- if !num1! lss 100 (set num=00!num1!) else (
- if !num1! lss 1000 (set num=0!num1!)
- )
- )
- set #%%i_!num!=%%j
- )
- for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
- set /a #%%i_a+=%%k
- )
- for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
- set /a n+=1
- if "%%j" equ "a" (echo !n! 合计 %%k) else (echo !n! %%i %%k)
- )
- 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
- @echo off
- setlocal enabledelayedexpansion
- ::构建变量
- for /f "tokens=1-2 delims= " %%i in (1.txt) do (
- set /a num1+=1
- if !num1! lss 10 (set num=000!num1!) else (
- if !num1! lss 100 (set num=00!num1!) else (
- if !num1! lss 1000 (set num=0!num1!)
- )
- )
- set #%%i_!num!=%%j
- )
- ::求和
- for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
- set /a #%%i_a+=%%k
- )
- ::输出
- for /f "tokens=1-3 delims=#_=" %%i in ('set #') do (
- set /a n+=1
- if "%%j" equ "a" (echo !n! 合计 %%k) else (echo !n! %%i %%k)
- )
- pause>nul
复制代码
作者: zhouyongjun 时间: 2009-6-6 20:20
- @echo off&setlocal enabledelayedexpansion
- (for %%i in (张三 李四 王五 赵六) do (
- for /f "tokens=1,2" %%a in ('findstr "%%i" "a.txt"') do (
- set/a n+=1,sn+=%%b
- echo !n! %%a %%b
- )
- set/a n+=1 &echo !n! 合计 !sn!
- set/a sn=0
- ))>b.txt
复制代码
作者: netbenton 时间: 2009-6-6 21:01
-
- @echo off&setlocal enabledelayedexpansion
- if defined 张三 goto :skip
- for %%a in (张三 李四 王五 赵六) do (set/a n+=1&set %%a=!n!)
- set ver=
- set/a 合计=0,n=1
- (for %%a "tokens=2,3" in ('%0^|sort') do (
- set /a 合计+=%%b
- if defined ver if !ver! neq %%a echo !n! 合计 !合计!&set/a n+=1&set/a 合计=0
- echo !n! %%a %%b
- set ver=%%a
- set/a n+=1
- )
- echo !n! 合计 !合计!)>b.txt
- start b.txt
- exit/b
-
- :skip
- for /f "tokens=1,2" %%a in (a.txt) do echo !%%a! %%a %%b
- goto :eof
复制代码
作者: inittab 时间: 2009-6-7 11:42
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2" %%a in (a.txt) do set "%%a=!%%a! %%b"&set/a .%%a+=%%b
- set n=0
- for %%a in (张三 李四 王五 赵六) do (
- for %%b in (!%%a!) do set/a n+=1&echo !n! %%a %%b
- set/a n+=1
- echo !n! 合计 !.%%a!
- )
- pause
复制代码
作者: keen 时间: 2009-6-8 17:22
我的跟6楼的一样,但是6楼因为使用了echo. 所以效率有点低。- @echo off&setlocal enabledelayedexpansion
- for %%i in (张三 李四 王五 赵六) do (
- set sum=0
- for /f "tokens=1,2" %%a in (a.txt) do (
- if "%%i" equ "%%a" (
- set /a n+=1
- set /a sum+=%%b
- echo !n! %%a %%b
- )
- )
- set /a n+=1
- echo !n! 合计 !sum!
- )
- pause
复制代码
作者: 随风 时间: 2009-6-8 18:03 标题: 回复 15楼 的帖子
对文本进行了多次循环,影响效率,再改改,争取只循环一次 (^_^)
作者: keen 时间: 2009-6-8 18:50 标题: 回复 16楼 的帖子
再改,就跟batman的代码一样了,先对整个文本过一遍把数字全部赋给变量。这样只对文本进行一次循环。
看来最佳答案只能类似batman的了。
作者: dali 时间: 2009-6-10 21:11
-
- @echo off
- for %%. in (张三 李四 王五 赵六) do call :ca %%.
- start b.txt
- exit
- :ca
- setlocal enabledelayedexpansion
- if exist b.txt for /f "tokens=1-3 delims= " %%i in (b.txt) do set n=%%i
- 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)
- set/a n+=1&&echo !n! 合计 %m% >>b.txt
- goto :eof
复制代码
[ 本帖最后由 dali 于 2009-6-10 21:12 编辑 ]
作者: jmz573515 时间: 2009-6-11 21:22
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims= " %%i in (a.txt) do (
- if "%%i"=="张三" set /a zs+=%%j && echo %%i %%j>>张三.txt
- if "%%i"=="李四" set /a ls+=%%j && echo %%i %%j>>李四.txt
- if "%%i"=="王五" set /a ww+=%%j && echo %%i %%j>>王五.txt
- if "%%i"=="赵六" set /a zl+=%%j && echo %%i %%j>>赵六.txt
- )
- echo 合计 !zs!>>张三.txt
- echo 合计 !ls!>>李四.txt
- echo 合计 !ww!>>王五.txt
- echo 合计 !zl!>>赵六.txt
- (for /f "delims=" %%i in (张三.txt 李四.txt 王五.txt 赵六.txt) do (
- set /a i+=1
- echo !i! %%i
- ))>b.txt
- del 张三.txt 李四.txt 王五.txt 赵六.txt
- start b.txt
复制代码
作者: lengmoke 时间: 2021-10-9 17:02
- @echo off
- Setlocal EnableDelayedExpansion
- set "str=张三 李四 王五 赵六"
- for /f "tokens=1,2" %%i in (a.txt) do ( set "%%i=!%%i! %%j" )
- set num=1
- for %%i in (%str%) do (
- set sum=0
- for %%j in (!%%i!) do ( echo !num! %%i %%j>>b.txt & set /a num+=1 & set /a sum+=%%j )
- echo !num! 总计 !sum!>>b.txt & set /a num+=1
- )
复制代码
作者: 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 |