标题: 【练习-035】根据原始数据生成简单统计表格 [打印本页]
作者: batman 时间: 2009-2-23 09:12 标题: 【练习-035】根据原始数据生成简单统计表格
岀题目的:
1、了解批处理对xls文件的操作
2、增强对批处理实用性的认识
加分原则:
满分20分,视情况加分(以思路为重)
题目如下:
有一张游客统计表内容如下(见附件a.xls):- 星期 参观人数
- 一 370
- 二 32
- 三 654
- 四 254
- 五 184
- 六 599
- 天 20
- 一 694
- 二 128
- 三 948
- 四 338
- 五 255
- 六 110
- 天 212
- ...................
- 六 958
- 天 865
- 一 225
- 二 620
复制代码
要求通过批处理生成统计表b.xls,内容如下(仅为示例):- 星期 天数(天) 参观人数(人) 日圴参观人数(人/天)
- 一 11 4950 450
- 二 11 4367 397
- 三 10 4660 466
- 四 10 4030 403
- 五 10 3870 387
- 六 10 4000 400
- 天 10 3930 393
- 合计 72 29807 据统计星期三为游客最多日
复制代码
相关说明
统计表中日均参观人数不做小数位限制(实际上批处理运算结果并无小数位)
链接: https://pan.baidu.com/s/1VEZJ9Fh90fG8SEZcJBPnzw?pwd=dj3r
作者: pusofalse 时间: 2009-2-23 11:36
- @echo Off & setlocal EnableDelayedExpansion
- If not Exist "_b.txt" (copy "a.xls" "_b.txt")
- For /f "skip=1 tokens=1*" %%a in (_b.txt) do (
- set /a m= n %% 7 + 1, n += 1, DayCount += 1
- set /a _!m!_ += 1, _!m! += %%b
- If not defined ._!m!_ set "._!m!_=%%a"
- )
- Echo 星期 天数(天) 参观人数(人) 日均参观人数>b.xls
- For /f "tokens=1,2 delims==" %%a in ('set _') do (
- set /a x += 1, y = x %% 2
- If !y! equ 1 (
- set /a PeopleCount=%%b, PeopleCounts += %%b
- ) else (
- set /a every=PeopleCount / %%b
- echo !.%%a! %%b !PeopleCount! !every!
- If !PeopleCount! gtr !max! set "max=!PeopleCount!" & set "_day=!.%%a!
- )
- )>>b.xls
- >>b.xls echo 合计 %DayCount% %PeopleCounts% %_day%
- start b.xls & del _b.txt
复制代码
[ 本帖最后由 pusofalse 于 2009-2-23 11:51 编辑 ]
作者: batman 时间: 2009-2-23 11:46
不知道兄弟是哪里对不上号,是b.xls中的结果吗?我在题目中标明了仅为示例啊。
作者: pusofalse 时间: 2009-2-23 12:58
简化了一点,还是钻了空子。
排序后第一行的“星期 参观人数”恰好排在了最后一行,也正好循环完了~- @echo off & setlocal EnableDelayedExpansion
- set "PreDay=一"
- echo 星期(人)[tab]天数(天)[tab]参观人数(人)[tab]日均参观人数(人/天)>b.xls
- For /f "tokens=1*" %%a in ('sort a.xls') do (
- set /a _%%a +=1, __%%a += %%b
- If "!PreDay!" neq "%%a" (
- set /a every = __!PreDay! / _!PreDay!, Count=__!PreDay!
- set /a All += _!Preday!, CountDays += __!Preday!
- Call echo !PreDay![tab]%%_!PreDay!%%[tab]%%__!PreDay!%%[tab]!every!
- If !count! gtr !max! set "max=!count!" & set "maxDay=!PreDay!"
- )
- set "PreDay=%%a"
- )>>b.xls
- >>b.xls echo 合计[tab]%All%[tab]%CountDays%[tab]星期%maxDay%为游客最多日
- start b.xls
复制代码
[ 本帖最后由 pusofalse 于 2009-2-23 13:01 编辑 ]
作者: batman 时间: 2009-2-23 14:56
pusofalse版主的反映太快,为给大家留点思考的时间,先将两贴屏蔽。
作者: terse 时间: 2009-2-23 15:43
我怎么计算出小数啊 是我这里出错吗?- @echo off&setlocal enabledelayedexpansion
- set "Tab=#"
- set w=3&REM 保留小数3位
- if "%Tab%"=="#" (
- echo.&echo 请先将代码中的 set "Tab=#" 中的#号改为Tab键
- echo.&pause>nul&exit
- )
- for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do set /a %%i+=1,_%%i+=%%j
- echo 星期 天数 参观人数 日圴参观人数
- for %%i in (一 二 三 四 五 六 天) do (
- set/a M=_%%i,Md=%%i,_n+=%%i,_m+=_%%i
- call:lp
- if !Di! gtr !n! set/a n=Di&set D=%%i
- echo %%i%Tab%!%%i!%Tab%!_%%i!%Tab%!Di!
- set "Di="&set "l="
- )
- set/a M=_m,Md=_n
- call:lp
- echo 合计%Tab%%_n%%Tab%%_m%%Tab%!Di!据统计星期%D%为游客最多日
- pause&exit
- :lp
- set/a l=%l%%M:~,1%%%Md,s=%l%%M:~,1%/Md
- if %Di%#==0# set Di=
- set Di=%Di%%s%
- set M=%M:~1%
- if defined M goto lp
- if defined Di (set Di=%Di%.)else set l=%Di%&set Di=0.
- for /l %%i in (1 1 %w%) do (
- set/a l*=10,s=l/Md,n+=1
- set Di=!Di!!s!
- set/a l=l%%Md
- )
复制代码
[ 本帖最后由 terse 于 2009-2-23 18:38 编辑 ]
作者: batman 时间: 2009-2-23 16:53
原帖由 terse 于 2009-2-23 15:43 发表
我怎么计算出小数啊 是我这里出错吗?
正确结果是有小数的,我上面的b.xls内容标明了仅为示例啊。
作者: batman 时间: 2009-2-23 19:35
如果运用得得当,代码应该能在10行内解决问题,大家都踊跃思考了。
作者: 随风 时间: 2009-2-23 19:54
是不需要显示小数吗?
作者: terse 时间: 2009-2-23 20:20
也不知计小数否 再贴一个
- @echo off&setlocal enabledelayedexpansion
- set "Tab=#"
- if "%Tab%"=="#" (
- echo.&echo 请先将代码中的 set "Tab=#" 中的#号改为Tab键
- echo.&pause>nul&exit
- )
- for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do set /a %%i+=1,_%%i+=%%j
- echo 星期 天数 参观人数 日圴参观人数
- for %%i in (一 二 三 四 五 六 天) do (
- set /a m=_%%i/%%i,_n+=%%i,_m+=_%%i
- if !_%%i! gtr !n! set/a n=m&set t=%%i
- echo %%i%Tab%!%%i!%Tab%!_%%i!%Tab%!m!
- )
- echo 合计%Tab%%_n%%Tab%%_m%%Tab%据统计星期%t%为游客最多日
- pause
复制代码
[ 本帖最后由 terse 于 2009-2-23 20:29 编辑 ]
作者: 随风 时间: 2009-2-23 20:39
呵呵,这题应该是考简洁度吧。。^_^- @echo off&setlocal enabledelayedexpansion
- set "Tab=#"
- if "%Tab%"=="#" (
- echo.&echo 请先将代码中的 set "Tab=#" 中的#号改为Tab键
- echo.&pause>nul&exit
- )
- for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do (
- set /a %%i+=1,c%%i+=%%j,%%irp=c%%i/%%i,zt+=1,zr+=%%j,zp=zr/zt
- if !c%%i! gtr !d! set d=!c%%i!&set e=%%i
- )
- echo 星期 天数 参观人数 日圴参观人数
- for %%i in (一 二 三 四 五 六 天) do echo%Tab%%%i%Tab%!%%i!%Tab%!c%%i!%Tab%!%%irp!
- echo 合计%Tab%!zt!%Tab%!zr!%Tab%!zp! 据统计星期%e%为游客最多日
- echo.&pause
复制代码
[ 本帖最后由 随风 于 2009-2-23 20:42 编辑 ]
作者: batman 时间: 2009-2-23 21:00
连随风兄都出面了,只好附上本人的拙码了:
请在运行前将#改为tab(制表符)- @echo off&setlocal enabledelayedexpansion
- set "tab=#"&set /a n+=1
- echo 星期%tab%天数(天)%tab%参观人数(人)%tab%日均参观人数(人/天)>b.xls
- for %%a in (一 二 三 四 五 六 天) do (
- set /a n+=1
- echo %%a%tab%=countif^(a.xls^^^!A:A,A!n!^)%tab%=sumif^(a.xls^^^!$A:$A,A!n!,a.xls^^^!$B:$B^)%tab%=C!n!/B!n!>>b.xls
- )
- echo 合计%tab%=sum^(b2:b8^)%tab%=sum^(c2:c8^)%tab%^="据统计星期"^&OFFSET(A2:A8,MATCH(MAX(D2:D8),D2:D8,0)-1,0,1,1)^&"为最多参观天数">>b.xls
- start a.xls&start b.xls
复制代码
[ 本帖最后由 batman 于 2009-2-23 21:09 编辑 ]
作者: lengmoke 时间: 2021-11-22 16:12
- @echo off & setlocal Enabledelayedexpansion
- for /f "tokens=1,2 delims= " %%i in (a.xls) do (
- if not defined %%i ( set /a n+=1 & set "str[!n!]=%%i" )
- set /a %%i+=%%j , _%%i+=1
- )
- set "max=0" , "maxindex="
- echo 星期 天数(天) 参观人数(人) 日圴参观人数(人/天)>b.xls
- for /l %%i in (2,1,%n%) do (
- call set /a day=%%_!str[%%i]!%% , people=%%!str[%%i]!%%
- set /a average=people/day , days+=day , peoples+=people
- if !average! gtr !max! ( set /a max=average , maxindex=%%i )
- echo !str[%%i]! !day! !people! !average!>>b.xls
- )
- echo 合计 %days% %peoples% 据统计星期!str[%maxindex%]!为游客最多日>>b.xls
- exit
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |