批处理之家's Archiver

batman 发表于 2011-4-15 11:00

【练习-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:
链接: [url]https://pan.baidu.com/s/1QhbUKzsuT21ZA9WLSCNj2g[/url] 提取码: refu

Bearxy 发表于 2011-4-15 11:06

[i=s] 本帖最后由 Bearxy 于 2011-4-15 11:12 编辑 [/i]

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

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

batman 发表于 2011-4-15 11:08

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

Bearxy 发表于 2011-4-15 12:57

[i=s] 本帖最后由 Bearxy 于 2011-4-15 13:36 编辑 [/i]

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

batman 发表于 2011-4-16 18:47

[i=s] 本帖最后由 batman 于 2011-4-18 10:44 编辑 [/i]

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

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

唉,要是新手望而怯步,老手们就出手吧。。。

terse 发表于 2011-4-19 10:42

[i=s] 本帖最后由 terse 于 2011-4-19 11:24 编辑 [/i]

没测试
简化下计算
另跳格键 需自己改[code]
@echo off&setlocal enabledelayedexpansion
::这里跳格键
set "Tab=        "
set /p str=<char.txt>nul
>char.xls echo !str!
set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
set "B区=王冬 刘通 文娟娟 马宇芊"
for %%i in (A区 B区) do for %%j in (!%%i!) do set %%j=%%i&>%%j.txt echo !str!
for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
    if /i "!%%d!" equ "%%a" if !_%%d! lss 150 (
          set /a _%%d+=1
          >>%%d.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
          set "%%a%Tab%%%b%Tab%%%c%Tab%%%d=a"
          for /f "tokens=1,2 delims=." %%i in ("%%c") do (
              set d=%%j000
              set/a #%%d+=%%i!d:~,3!"
          )
    ) else set %%d=&2>nul move %%d.txt "%%d_!#%%d:~,-3!.!#%%d:~-3!.xls"
)
for %%i in (A区 B区) do for %%j in (!%%i!) do if not defined %%j set %%i=!%%i:%%j=!
for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
    if "!%%a%Tab%%%b%Tab%%%c%Tab%%%d!" equ "" (
       for %%i in (!%%a!) do set name=%%~i
       for %%e in (!name!) do if !_%%e! lss 150 (
           set /a _%%e+=1
           >>%%e.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
           for /f "tokens=1,2 delims=." %%i in ("%%c") do (
              set d=%%j000
              set/a "#%%e+=%%i!d:~,3!"
           )
       ) else set %%a=!%%a:%%e=!&set name=&2>nul move %%e.txt "%%e_!#%%e:~,-3!.!#%%e:~-3!.xls"
         if not defined name >>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
    )
)
pause
[/code]

舒待子 发表于 2011-4-19 11:11

[quote]没测试
@echo off&setlocal enabledelayedexpansion
set "Tab=        "
set /p str=nul
>char.xls echo !str!
set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
set "B区=王冬 刘通 文娟娟 马宇芊"
for %%i in (A区 B区)  ...
[size=2][color=#999999]terse 发表于 2011-4-19 10:42[/color] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=75886&ptid=11899][img]http://www.bathome.net/images/common/back.gif[/img][/url][/size][/quote]

                           好!

batman 发表于 2011-4-19 12:29

唉望眼欲穿啊,下面是本人出题前的解(注意替换tab):[code]
@echo off&setlocal enabledelayedexpansion
set "names=b-王冬 b-刘通 b-文娟娟 b-马宇芊 a-候国强 a-毛远锋 a-易湛慧 a-李楠 a-池茜"
rd /s /q char 2>nul&md char&set "tab=        "
for /f "tokens=1-4 delims=%tab%" %%a in (char.txt) do (
    if not defined hard (
       set "hard=a"
       for %%i in (%names%) do (
           for /f "tokens=1-2 delims=-" %%j in ("%%i") do (
               set "%%k=%%j"&echo %%a%tab%%%b%tab%%%c%tab%%%d>char\%%k.xls
               set /a _%%k=0
           )
       )
       ) else (
       if /i "%%a" equ "!%%d!区" if !_%%d! lss 150 set "flag=a"
       if defined flag (
          echo %%a%tab%%%b%tab%%%c%tab%%%d>>char\%%d.xls
          set "flag="&set /a _%%d+=1
          for /f "tokens=1-2 delims=." %%x in ("%%c") do (
              set "a=%%y00"&set /a .%%d+=%%x,..%%d+=1!a:~,2!%%100
              if !..%%d! geq 100 set /a ..%%d-=100,.%%d+=1
          )
          ) else (
          echo %%a %%b %%c %%d>>char\char.xls
       )
   )
)
set "flag="
for %%a in (%names%) do (
    for /f "tokens=1-2 delims=-" %%b in ("%%a") do (
        for /f "tokens=1-4" %%d in (char\char.xls) do (
      if !_%%c! lss 150 if /i "%%d" equ "%%b区" set "flag=a"
            if defined flag (
               echo %%d%tab%%%e%tab%%%f%tab%%%g>>char\%%c.xls
        set /a _%%c+=1&set "flag="
               for /f "tokens=1-2 delims=." %%x in ("%%f") do (
                   set "a=%%y00"&set /a .%%c+=%%x,..%%c+=1!a:~,2!%%100
                   if !..%%c! geq 100 set /a ..%%c-=100,.%%c+=1
               )
               ) else (
               echo %%d%tab%%%e%tab%%%f%tab%%%g>>char\tem
            )  
        )
        if !..%%c! lss 10 set "..%%c=0!..%%c!"
        ren char\%%c.xls %%c-!.%%c!.!..%%c!.xls
        if exist char\tem del /q char\char.xls&ren char\tem char.xls
    )
)
start char
[/code]

caruko 发表于 2011-4-19 19:10

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

caruko 发表于 2011-4-19 19:17

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

terse 发表于 2011-4-19 23:58

受batman代码启发 对于char.xls文件的生成 还是用个过度吧 效率上可提升点[code]
@echo off&setlocal enabledelayedexpansion
::这里跳格键
set "Tab=        "
set /p str=<char.txt>nul
>char.xls echo !str!
set "A区=候国强 毛远锋 易湛慧 李楠 池茜"
set "B区=王冬 刘通 文娟娟 马宇芊"
for %%i in (A区 B区) do for %%j in (!%%i!) do set %%j=%%i&>%%j.txt echo !str!
for /f "skip=1 tokens=1-4" %%a in (char.txt) do (
    if /i "!%%d!" equ "%%a" (
       if !_%%d! lss 150 (
          set /a _%%d+=1
          >>%%d.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
          for /f "tokens=1,2 delims=." %%i in ("%%c") do (
              set d=%%j000
              set/a #%%d+=%%i!d:~,3!
          )
       ) else (
         2>nul move "%%d.txt" "%%d_!#%%d:~,-3!.!#%%d:~-3!.xls"
         set %%d=&>>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
       )
    ) else >>char.xls echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
)
for %%i in (A区 B区) do for %%j in (!%%i!) do if not defined %%j set %%i=!%%i:%%j=!
for /f "tokens=1-4" %%a in (char.xls) do (
    for %%i in (!%%a!) do set name=%%~i
    for %%e in (!name!) do if !_%%e! lss 150 (
        set /a _%%e+=1
        >>%%e.txt echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
        for /f "tokens=1,2 delims=." %%i in ("%%c") do (
            set d=%%j000
            set/a #%%e+=%%i!d:~,3!
        )
    ) else set %%a=!%%a:%%e=!&set name=&2>nul move "%%e.txt" "%%e_!#%%e:~,-3!.!#%%e:~-3!.xls"
      if not defined name >>char.x echo;%%a%Tab%%%b%Tab%%%c%Tab%%%d
)
move char.x char.xls
pause
[/code]

qzwqzw 发表于 2011-4-20 15:09

[quote]小知识:批可以直接生成xls文件,也可对生成的xls进行重操作,前提是你装了office。。。
[size=2][color=#999999]batman 发表于 2011-4-15 11:08[/color] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=75524&ptid=11899][img]http://www.bathome.net/images/common/back.gif[/img][/url][/size][/quote]
怎么感觉大家都在直接echo输出xls文件?
这应该是以制表符分隔的文本文件吧
还以为会用VBS脚本呢
真以为取了个xls的扩展名就是excel文件了

caruko 发表于 2011-4-20 20:46

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

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.