批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

【练习-035】根据原始数据生成简单统计表格

岀题目的:
  1、了解批处理对xls文件的操作
  2、增强对批处理实用性的认识
加分原则:
  满分20分,视情况加分(以思路为重)
题目如下:
  有一张游客统计表内容如下(见附件a.xls):
  1. 星期        参观人数
  2. 一        370
  3. 二        32
  4. 三        654
  5. 四        254
  6. 五        184
  7. 六        599
  8. 天        20
  9. 一        694
  10. 二        128
  11. 三        948
  12. 四        338
  13. 五        255
  14. 六        110
  15. 天        212
  16. ...................
  17. 六        958
  18. 天        865
  19. 一        225
  20. 二        620
复制代码

  要求通过批处理生成统计表b.xls,内容如下(仅为示例):
  1. 星期        天数(天)        参观人数(人)        日圴参观人数(人/天)
  2. 一        11        4950        450
  3. 二        11        4367        397
  4. 三        10        4660        466
  5. 四        10        4030        403
  6. 五        10        3870        387
  7. 六        10        4000        400
  8. 天        10        3930        393
  9. 合计        72        29807        据统计星期三为游客最多日
复制代码

相关说明
  统计表中日均参观人数不做小数位限制(实际上批处理运算结果并无小数位)
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

  1. @echo Off & setlocal EnableDelayedExpansion
  2. If not Exist "_b.txt" (copy "a.xls" "_b.txt")
  3. For /f "skip=1 tokens=1*" %%a in (_b.txt) do (
  4.        set /a m= n %% 7 + 1, n += 1, DayCount += 1
  5.        set /a _!m!_ += 1, _!m! += %%b
  6.        If not defined ._!m!_ set "._!m!_=%%a"
  7. )
  8. Echo 星期 天数(天) 参观人数(人) 日均参观人数>b.xls
  9. For /f "tokens=1,2 delims==" %%a in ('set _') do (
  10.        set /a x += 1, y = x %% 2
  11.        If !y! equ 1 (
  12.            set /a PeopleCount=%%b, PeopleCounts += %%b
  13.        ) else (
  14.            set /a every=PeopleCount / %%b
  15.            echo !.%%a! %%b !PeopleCount! !every!
  16.            If !PeopleCount! gtr !max! set "max=!PeopleCount!" & set "_day=!.%%a!
  17.        )
  18. )>>b.xls
  19. >>b.xls echo 合计 %DayCount% %PeopleCounts% %_day%
  20. start b.xls & del _b.txt
复制代码

[ 本帖最后由 pusofalse 于 2009-2-23 11:51 编辑 ]
心绪平和,眼藏静谧。

TOP

不知道兄弟是哪里对不上号,是b.xls中的结果吗?我在题目中标明了仅为示例啊。
***共同提高***

TOP

简化了一点,还是钻了空子。
排序后第一行的“星期        参观人数”恰好排在了最后一行,也正好循环完了~
  1. @echo off & setlocal EnableDelayedExpansion
  2. set "PreDay=一"
  3. echo 星期(人)[tab]天数(天)[tab]参观人数(人)[tab]日均参观人数(人/天)>b.xls
  4. For /f "tokens=1*" %%a in ('sort a.xls') do (
  5.        set /a _%%a +=1, __%%a += %%b
  6.        If "!PreDay!" neq "%%a" (
  7.             set /a every = __!PreDay! / _!PreDay!, Count=__!PreDay!
  8.             set /a All += _!Preday!, CountDays += __!Preday!
  9.             Call echo !PreDay![tab]%%_!PreDay!%%[tab]%%__!PreDay!%%[tab]!every!
  10.             If !count! gtr !max! set "max=!count!" & set "maxDay=!PreDay!"
  11.         )
  12.         set "PreDay=%%a"
  13. )>>b.xls
  14. >>b.xls echo 合计[tab]%All%[tab]%CountDays%[tab]星期%maxDay%为游客最多日
  15. start b.xls
复制代码

[ 本帖最后由 pusofalse 于 2009-2-23 13:01 编辑 ]
1

评分人数

    • batman: 的确有取巧成分PB + 15
心绪平和,眼藏静谧。

TOP

pusofalse版主的反映太快,为给大家留点思考的时间,先将两贴屏蔽。
***共同提高***

TOP

我怎么计算出小数啊  是我这里出错吗?
  1. @echo off&setlocal enabledelayedexpansion
  2. set "Tab=#"
  3. set w=3&REM 保留小数3位
  4. if "%Tab%"=="#" (
  5.    echo.&echo  请先将代码中的 set "Tab=#" 中的#号改为Tab键
  6.    echo.&pause>nul&exit
  7. )
  8. for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do set /a %%i+=1,_%%i+=%%j
  9. echo 星期   天数   参观人数  日圴参观人数
  10. for %%i in (一 二 三 四 五 六 天) do (
  11.     set/a M=_%%i,Md=%%i,_n+=%%i,_m+=_%%i
  12.     call:lp
  13.     if !Di! gtr !n! set/a n=Di&set D=%%i
  14.     echo %%i%Tab%!%%i!%Tab%!_%%i!%Tab%!Di!
  15.     set "Di="&set "l="
  16.   )
  17.    set/a M=_m,Md=_n
  18.    call:lp
  19.    echo 合计%Tab%%_n%%Tab%%_m%%Tab%!Di!据统计星期%D%为游客最多日
  20. pause&exit
  21. :lp
  22. set/a l=%l%%M:~,1%%%Md,s=%l%%M:~,1%/Md
  23.     if %Di%#==0# set Di=
  24.     set Di=%Di%%s%
  25.     set M=%M:~1%
  26.     if defined M goto lp
  27.     if defined Di (set Di=%Di%.)else set l=%Di%&set Di=0.
  28.     for /l %%i in (1 1 %w%) do (
  29.     set/a l*=10,s=l/Md,n+=1
  30.     set Di=!Di!!s!
  31.     set/a l=l%%Md
  32. )
复制代码

[ 本帖最后由 terse 于 2009-2-23 18:38 编辑 ]
1

评分人数

    • batman: 代码是否复杂了点?PB + 10

TOP

原帖由 terse 于 2009-2-23 15:43 发表
我怎么计算出小数啊  是我这里出错吗?

正确结果是有小数的,我上面的b.xls内容标明了仅为示例啊。
***共同提高***

TOP

如果运用得得当,代码应该能在10行内解决问题,大家都踊跃思考了。
***共同提高***

TOP

是不需要显示小数吗?
技术问题请到论坛发帖求助!

TOP

也不知计小数否  再贴一个
  1. @echo off&setlocal enabledelayedexpansion
  2. set "Tab=#"
  3. if "%Tab%"=="#" (
  4.    echo.&echo  请先将代码中的 set "Tab=#" 中的#号改为Tab键
  5.    echo.&pause>nul&exit
  6. )
  7. for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do set /a %%i+=1,_%%i+=%%j
  8. echo 星期   天数   参观人数  日圴参观人数
  9. for %%i in (一 二 三 四 五 六 天) do (
  10.     set /a m=_%%i/%%i,_n+=%%i,_m+=_%%i
  11.     if !_%%i! gtr !n! set/a n=m&set t=%%i
  12.     echo %%i%Tab%!%%i!%Tab%!_%%i!%Tab%!m!
  13.   )
  14. echo 合计%Tab%%_n%%Tab%%_m%%Tab%据统计星期%t%为游客最多日
  15. pause
复制代码

[ 本帖最后由 terse 于 2009-2-23 20:29 编辑 ]

TOP

呵呵,这题应该是考简洁度吧。。^_^
  1. @echo off&setlocal enabledelayedexpansion
  2. set "Tab=#"
  3. if "%Tab%"=="#" (
  4.    echo.&echo  请先将代码中的 set "Tab=#" 中的#号改为Tab键
  5.    echo.&pause>nul&exit
  6. )
  7. for /f "skip=1 tokens=1* delims=%Tab%" %%i in (a.xls) do (
  8.    set /a %%i+=1,c%%i+=%%j,%%irp=c%%i/%%i,zt+=1,zr+=%%j,zp=zr/zt
  9.    if !c%%i! gtr !d! set d=!c%%i!&set e=%%i
  10. )
  11. echo 星期   天数   参观人数  日圴参观人数
  12. for %%i in (一 二 三 四 五 六 天) do echo%Tab%%%i%Tab%!%%i!%Tab%!c%%i!%Tab%!%%irp!
  13. echo 合计%Tab%!zt!%Tab%!zr!%Tab%!zp! 据统计星期%e%为游客最多日
  14. echo.&pause
复制代码

[ 本帖最后由 随风 于 2009-2-23 20:42 编辑 ]
1

评分人数

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

TOP

连随风兄都出面了,只好附上本人的拙码了:
请在运行前将#改为tab(制表符)
  1. @echo off&setlocal enabledelayedexpansion
  2. set "tab=#"&set /a n+=1
  3. echo 星期%tab%天数(天)%tab%参观人数(人)%tab%日均参观人数(人/天)>b.xls
  4. for %%a in (一 二 三 四 五 六 天) do (
  5.    set /a n+=1
  6.     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
  7. )
  8. 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
  9. start a.xls&start b.xls
复制代码

[ 本帖最后由 batman 于 2009-2-23 21:09 编辑 ]
***共同提高***

TOP

  1. @echo off & setlocal Enabledelayedexpansion
  2. for /f "tokens=1,2 delims= " %%i in (a.xls) do (
  3.    if not defined %%i ( set /a n+=1 & set "str[!n!]=%%i" )
  4.    set /a %%i+=%%j , _%%i+=1
  5. )
  6. set "max=0" , "maxindex="
  7. echo 星期   天数(天)  参观人数(人)   日圴参观人数(人/天)>b.xls
  8. for /l %%i in (2,1,%n%) do (
  9.    call set /a day=%%_!str[%%i]!%% , people=%%!str[%%i]!%%
  10.    set /a average=people/day , days+=day , peoples+=people
  11.    if !average! gtr !max! ( set /a max=average , maxindex=%%i )
  12.    echo !str[%%i]!       !day!             !people!              !average!>>b.xls
  13. )
  14. echo 合计    %days%             %peoples%           据统计星期!str[%maxindex%]!为游客最多日>>b.xls
  15. exit
复制代码

TOP

返回列表