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

【练习-063】根据原始文本分配数据并生成xsl文件

出题目的:
  综合考查大家的变量计算及文本处理能力
解题要求:
  代码高效并尽可能简洁
  请老手们暂不出手,但可跟贴讨论指导新手
加分原则:
  满分30分,视情况加分(思路为重)
题目如下:
  有文本文件char.txt(见附件),四列n行,每一行都是一个客户的信息(区域 姓名 费用 关系人),现在用批处理将这些客户按150户/每人的原则分配到九个人手中(王冬 刘通 文娟娟 马宇芊 候国强 毛远锋 易湛慧 李楠 池茜)并以xls文件保存,同时在分配时要同时满足以下原则:
  1、每人150户不可多也不可少;
  2、王冬 刘通 文娟娟 马宇芊四个人只能分配B区的客户,候国强 毛远锋 易湛慧 李楠 池茜这五人只能分配A区的客户;
  3、每个人要优先分配关系人是自己的客户,如果少于150的则从其他关系人中补足150条;
  4、计算每个人分配到的客户的总费用并标在文件名中,如易湛慧-9865.42;
  5、没有分配完的用户统一放在char.xsl中;
  6、所有xls文件要求全信息输入(区域 姓名 费用 关系人),并且都要在第一行输入这个表头。
说明:
  原始数据足够满足题目的条件,这点不要多虑。
附件char.txt:
链接: https://pan.baidu.com/s/1QhbUKzsuT21ZA9WLSCNj2g 提取码: refu
***共同提高***

这么来说,直接写excel宏来做更高效吧..

TOP

小知识:批可以直接生成xls文件,也可对生成的xls进行重操作,前提是你装了office。。。
batman 发表于 2011-4-15 11:08

怎么感觉大家都在直接echo输出xls文件?
这应该是以制表符分隔的文本文件吧
还以为会用VBS脚本呢
真以为取了个xls的扩展名就是excel文件了
天的白色影子

TOP

受batman代码启发 对于char.xls文件的生成 还是用个过度吧 效率上可提升点
  1. @echo off&setlocal enabledelayedexpansion
  2. ::这里跳格键
  3. set "Tab= "
  4. set /p str=<char.txt>nul
  5. >char.xls echo !str!
  6. set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
  7. set "B区=王冬 刘通 文娟娟 马宇芊"
  8. for %%i in (A区 B区) do for %%j in (!%%i!) do set %%j=%%i&>%%j.txt echo !str!
  9. for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
  10.     if /i "!%%d!" equ "%%a" (
  11.        if !_%%d! lss 150 (
  12.           set /a _%%d+=1
  13.           >>%%d.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  14.           for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  15.               set d=%%j000
  16.               set/a #%%d+=%%i!d:~,3!
  17.           )
  18.        ) else (
  19.          2>nul move "%%d.txt" "%%d_!#%%d:~,-3!.!#%%d:~-3!.xls"
  20.          set %%d=&>>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  21.        )
  22.     ) else >>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  23. )
  24. for %%i in (A区 B区) do for %%j in (!%%i!) do if not defined %%j set %%i=!%%i:%%j=!
  25. for /f "tokens=1-4" %%a in (char.xls) do (
  26.     for %%i in (!%%a!) do set name=%%~i
  27.     for %%e in (!name!) do if !_%%e! lss 150 (
  28.         set /a _%%e+=1
  29.         >>%%e.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  30.         for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  31.             set d=%%j000
  32.             set/a #%%e+=%%i!d:~,3!
  33.         )
  34.     ) else set %%a=!%%a:%%e=!&set name=&2>nul move "%%e.txt" "%%e_!#%%e:~,-3!.!#%%e:~-3!.xls"
  35.       if not defined name >>char.x echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  36. )
  37. move char.x char.xls
  38. pause
复制代码

TOP

总费用,可以将 整数 跟 小数 分别相加,全部加完之后 整数+小数/100

TOP

咳,想了一下,跟BATMAN算法估计差不多。
对应好 A,B——名字,循环中符合的直接写入文件。
剩下的可分配的都设为变量,循环完以后,没有达到150条的从 set A_ ,SET B_ 中取得,同时销毁变量。
最后将  set _ 变量中剩下的全写入char.txt文件。

TOP

唉望眼欲穿啊,下面是本人出题前的解(注意替换tab):
  1. @echo off&setlocal enabledelayedexpansion
  2. set "names=b-王冬 b-刘通 b-文娟娟 b-马宇芊 a-候国强 a-毛远锋 a-易湛慧 a-李楠 a-池茜"
  3. rd /s /q char 2>nul&md char&set "tab= "
  4. for /f "tokens=1-4 delims=%tab%" %%a in (char.txt) do (
  5.     if not defined hard (
  6.        set "hard=a"
  7.        for %%i in (%names%) do (
  8.            for /f "tokens=1-2 delims=-" %%j in ("%%i") do (
  9.                set "%%k=%%j"&echo %%a%tab%%%b%tab%%%c%tab%%%d>char\%%k.xls
  10.                set /a _%%k=0
  11.            )
  12.        )
  13.        ) else (
  14.        if /i "%%a" equ "!%%d!区" if !_%%d! lss 150 set "flag=a"
  15.        if defined flag (
  16.           echo %%a%tab%%%b%tab%%%c%tab%%%d>>char\%%d.xls
  17.           set "flag="&set /a _%%d+=1
  18.           for /f "tokens=1-2 delims=." %%x in ("%%c") do (
  19.               set "a=%%y00"&set /a .%%d+=%%x,..%%d+=1!a:~,2!%%100
  20.               if !..%%d! geq 100 set /a ..%%d-=100,.%%d+=1
  21.           )
  22.           ) else (
  23.           echo %%a %%b %%c %%d>>char\char.xls
  24.        )
  25.    )
  26. )
  27. set "flag="
  28. for %%a in (%names%) do (
  29.     for /f "tokens=1-2 delims=-" %%b in ("%%a") do (
  30.         for /f "tokens=1-4" %%d in (char\char.xls) do (
  31.       if !_%%c! lss 150 if /i "%%d" equ "%%b区" set "flag=a"
  32.             if defined flag (
  33.                echo %%d%tab%%%e%tab%%%f%tab%%%g>>char\%%c.xls
  34.         set /a _%%c+=1&set "flag="
  35.                for /f "tokens=1-2 delims=." %%x in ("%%f") do (
  36.                    set "a=%%y00"&set /a .%%c+=%%x,..%%c+=1!a:~,2!%%100
  37.                    if !..%%c! geq 100 set /a ..%%c-=100,.%%c+=1
  38.                )
  39.                ) else (
  40.                echo %%d%tab%%%e%tab%%%f%tab%%%g>>char\tem
  41.             )  
  42.         )
  43.         if !..%%c! lss 10 set "..%%c=0!..%%c!"
  44.         ren char\%%c.xls %%c-!.%%c!.!..%%c!.xls
  45.         if exist char\tem del /q char\char.xls&ren char\tem char.xls
  46.     )
  47. )
  48. start char
复制代码
***共同提高***

TOP

没测试
@echo off&setlocal enabledelayedexpansion
set "Tab=        "
set /p str=nul
>char.xls echo !str!
set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
set "B区=王冬 刘通 文娟娟 马宇芊"
for %%i in (A区 B区)  ...
terse 发表于 2011-4-19 10:42


                           好!
dooooooooo

TOP

本帖最后由 terse 于 2011-4-19 11:24 编辑

没测试
简化下计算
另跳格键 需自己改
  1. @echo off&setlocal enabledelayedexpansion
  2. ::这里跳格键
  3. set "Tab= "
  4. set /p str=<char.txt>nul
  5. >char.xls echo !str!
  6. set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
  7. set "B区=王冬 刘通 文娟娟 马宇芊"
  8. for %%i in (A区 B区) do for %%j in (!%%i!) do set %%j=%%i&>%%j.txt echo !str!
  9. for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
  10.     if /i "!%%d!" equ "%%a" if !_%%d! lss 150 (
  11.           set /a _%%d+=1
  12.           >>%%d.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  13.           set "%%a%Tab%%%b%Tab%%%c%Tab%%%d=a"
  14.           for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  15.               set d=%%j000
  16.               set/a #%%d+=%%i!d:~,3!"
  17.           )
  18.     ) else set %%d=&2>nul move %%d.txt "%%d_!#%%d:~,-3!.!#%%d:~-3!.xls"
  19. )
  20. for %%i in (A区 B区) do for %%j in (!%%i!) do if not defined %%j set %%i=!%%i:%%j=!
  21. for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
  22.     if "!%%a%Tab%%%b%Tab%%%c%Tab%%%d!" equ "" (
  23.        for %%i in (!%%a!) do set name=%%~i
  24.        for %%e in (!name!) do if !_%%e! lss 150 (
  25.            set /a _%%e+=1
  26.            >>%%e.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  27.            for /f "tokens=1,2 delims=." %%i in ("%%c") do (
  28.               set d=%%j000
  29.               set/a "#%%e+=%%i!d:~,3!"
  30.            )
  31.        ) else set %%a=!%%a:%%e=!&set name=&2>nul move %%e.txt "%%e_!#%%e:~,-3!.!#%%e:~-3!.xls"
  32.          if not defined name >>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
  33.     )
  34. )
  35. pause
复制代码
1

评分人数

    • batman: 你小子拿分很积极嘛PB + 30

TOP

本帖最后由 batman 于 2011-4-18 10:44 编辑

怎么没有人解题了,是太难了吗?这就是一道批的实际应用题啊,相信很多人在工作中会遇到的。。。

如果新手觉得计算难了点,可以不完成计算这一步。。。

唉,要是新手望而怯步,老手们就出手吧。。。
***共同提高***

TOP

本帖最后由 Bearxy 于 2011-4-15 13:36 编辑

上班时间到了,我只写了一点点。新手,刚学的,别笑我哈。A区就这样分了,B区代码也是一样。
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a num=0
  3. set /a str=1
  4. set "test=char.txt"
  5. findstr /c:"A区" "%test%" >>A区.txt
  6. findstr /c:"B区" "%test%" >>B区.txt
  7. for /f "delims=" %%i in (A区.txt) do (
  8. set /a num=!num!+1&echo !num!&echo %%i>>!str!.txt
  9. if !num!==150 (set /a num=0&set /a str=!str!+1)
  10. )
  11. ren "1.txt" "候国强.xls"&ren "2.txt" "毛远锋.xls"
  12. ren "3.txt" "易湛慧.xls"&ren "4.txt" "李楠.xls"
  13. ren "5.txt" "池茜.xls"&del "A区.txt" /f /s /q>nul
  14. pause
复制代码
代码运行后会余下6,7,8.txt三个TXT文件。我的思路是将不足150行的,从6,7,8抽取。然后用findstr对比剩下的文本,生成的文本就是余下没有分配的了。那个运算的,我实在做不出来……边上班边想吧,晚上再来。
1

评分人数

    • batman: 积极参与才有进步PB + 2

TOP

小知识:批可以直接生成xls文件,也可对生成的xls进行重操作,前提是你装了office。。。
***共同提高***

TOP

本帖最后由 Bearxy 于 2011-4-15 11:12 编辑

占楼编辑,呵呵,第三条难度很大啊。

才一会没来,又加了一条,悲剧……计算那条我百分百拿不下

TOP

返回列表