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

【练习-052】根据原始数据进行相关统计操作

出题目的:
    综合考察会员的文本数据处理能力
加分原则:
    满分30分,酌情加分,以思路为重
题目如下:
    有一从excel(实际中是要对excel直接操作)导入的文本a.txt如下:
  1. 部门 A项完成 B项完成 C项完成 D项完成 E项完成 F项完成 当天排名 当月累计排名
  2. 一分局 2 7 0 1 7 7 2  1
  3. 二分局 0 0 0 1 0 0 6  2
  4. 三分局 2 8 1 1 1 9 1  3
  5. 四分局 0 0 0 1 1 0 5  5
  6. 五分局 0 0 0 1 2 1 3  7
  7. 六分局 0 0 0 1 0 0 4  6
  8. 七分局 0 5 0 1 0 6 6  3
复制代码
要求对用批处理后生成统计文本b.txt,要求列出每项完成的总和,如有完成为0的局则
一一列出,没有则列出"无";将当日排名和当月排名按名次从小到大的顺序列出局名和名次
,请注意有排名相同的情况。
  1. A项完成4,完成为0的局:二分局,四分局,五分局,六分局,七分局
  2. B项完成20,完成为0的局:二分局,四分局,五分局,六分局
  3. C项完成1,完成为0的局:一分局,二分局,四分局,五分局,六分局,七分局
  4. D项完成7,完成为0的局:无
  5. E项完成11,完成为0的局:二分局,六分局,七分局
  6. F项完成23,完成为0的局:二分局,四分局,六分局
  7. 当日排名:三分局1,一分局2,五分局3,六分局4,四分局5,二分局6,七分局6
  8. 当月累计排名:一分局1,二分局2,三分局3,七分局3,四分局5,六分局6,五分局7
复制代码
   提示:分局数和项目数都是未知的

[ 本帖最后由 batman 于 2009-11-19 21:34 编辑 ]
1

评分人数

***共同提高***

提示:批可以不用读取a.txt第一行,用一系列的变量来代替首行内容
***共同提高***

TOP

回复 5楼 的帖子

这个排序真是不同于以往的排序,原因是你就是排出了名次的序,你还要考虑和分局关联,特别是出现同名次的情况下
***共同提高***

TOP

回复 7楼 的帖子

楼上是不是搞错题意了,排名是用一定的公式算出来的,而不是由前面的完成情况来定的。。。
***共同提高***

TOP

直接读到的啊,排名肯定是有同名次的情况出现的,如当日排名:三分局1,一分局2,五分局3,六分局4,四分局5,二分局6,七分局6
***共同提高***

TOP

回复 12楼 的帖子

我没说此题无解吧,晕,我只是一再在强调出现同名次的情况需要处理
***共同提高***

TOP

回复 15楼 的帖子

为什么要调成第四名,说了有并列名次出现的情况。。。

[ 本帖最后由 batman 于 2009-11-19 22:10 编辑 ]
***共同提高***

TOP

回复 17楼 的帖子

还请就此题给出完整代码
***共同提高***

TOP

楼上的效率显然有问题。。。这就是用^|sort造成的

[ 本帖最后由 batman 于 2009-11-19 23:50 编辑 ]
***共同提高***

TOP

本人的解

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.     set /a hang+=1,lie=0
  4.     for %%b in (%%a) do (
  5.         set /a lie+=1&set "str=%%b"
  6.         if not defined fj if "!str:~,1!" equ "当" set /a fj=lie
  7.         if !hang! equ 1 (
  8.            if !lie! neq 1 set "_!lie!=%%b#:"
  9.            ) else (
  10.            if !lie! equ 1 (
  11.               set "ju=%%b"
  12.               ) else (
  13.               for %%c in (!lie!) do (
  14.                   if %%c lss !fj! (
  15.                      set /a num_%%c+=%%b
  16.                      if !str! equ 0 set "_%%c=!_%%c!!ju!,"
  17.                      ) else (
  18.                      if not defined %%c_%%b (
  19.                         set "%%c_%%b=!ju!%%b,"
  20.                         ) else (
  21.                         set "%%c_%%b=!%%c_%%b!!ju!%%b,"
  22.                      )
  23.                   )
  24.                )
  25.             )
  26.          )
  27.     )
  28. )
  29. cd.>b.txt
  30. for /l %%a in (2,1,%lie%) do (
  31.     set "str=!_%%a!"
  32.     if %%a lss %fj% (
  33.        for %%b in (!num_%%a!) do (
  34.            if "!str:~-1!" neq ":" (
  35.               set "str=!str:~,-1!"&echo !str:#=%%b,完成为0的局!>>b.txt
  36.               ) else (
  37.               echo !str:#=%%b,完成为0的局!无>>b.txt
  38.            )
  39.        )
  40.        ) else (
  41.        for /l %%b in (1,1,%hang%) do if defined %%a_%%b set "str=!str! !%%a_%%b!"
  42.        set "str=!str:#=!"&echo !str:~,-1!>>b.txt
  43.     )
  44. )
  45. start b.txt
复制代码


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

TOP

回复 23楼 的帖子

后面的两行才是本题的重点哦。。。
***共同提高***

TOP

回复 26楼 的帖子

我现在用的方法可不是排序哦,严格上来讲应属于变量赋值法。
***共同提高***

TOP

回复 29楼 的帖子

针对此代码发表点个人意见,不当之处还请误解:
一、优点:
1、在批处理中引入数组概念,拓展了批的处理功能;
2、代码较简洁,这其实也是因为引入了数组,减少了累加赋值的过程;
3、书写较规范,但请注意a.x是不符合题意的。
二、不足之处:
1、因为代码是用数组变量表示的每个单元的值,所以变量用量较大,如达到百行百列时,变
量就要用到一万个,是对系统资源的考验;
2、出现6这个常量,这与题意中未知行未知列是不相符的;
3、代码中使用了goto循环,在效率上比for循环要低。
总之,exist这段代码还是表现出了其高水平的批处理技巧,值得大家学习。
***共同提高***

TOP

&&这个问题的确是我在工作中遇到和解决的,实际上的操作是用批先生成一个temp.vbs,

然后用temp.vbs读取指定工作表的指定分页(sheet*)的指定范围指定单元格的数据,然

后输入到temp.txt(这是用批做不到的),然后用批进行数据统计分析并输出最终想要的结

果。这是个实用性很强的问题,因为考虑难度比较大,所以在出题时省去了读取excel表数

据的步骤,直接给出了temp.txt的内容。所以请工作中与excel表打交道的会员都认真做一下

本题,不做也可以对照前面给出的代码仔细思考一下,说不定以后你就会遇到类似的问题。
***共同提高***

TOP

回复 34楼 的帖子

输出时当日排名和当月排名搞反了!
***共同提高***

TOP

返回列表