标题: 【练习-063】根据原始文本分配数据并生成xsl文件 [打印本页]
作者: 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:
链接: https://pan.baidu.com/s/1QhbUKzsuT21ZA9WLSCNj2g 提取码: refu
作者: Bearxy 时间: 2011-4-15 11:06
本帖最后由 Bearxy 于 2011-4-15 11:12 编辑
占楼编辑,呵呵,第三条难度很大啊。
才一会没来,又加了一条,悲剧……计算那条我百分百拿不下
作者: batman 时间: 2011-4-15 11:08
小知识:批可以直接生成xls文件,也可对生成的xls进行重操作,前提是你装了office。。。
作者: Bearxy 时间: 2011-4-15 12:57
本帖最后由 Bearxy 于 2011-4-15 13:36 编辑
上班时间到了,我只写了一点点。新手,刚学的,别笑我哈。A区就这样分了,B区代码也是一样。- @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
复制代码
代码运行后会余下6,7,8.txt三个TXT文件。我的思路是将不足150行的,从6,7,8抽取。然后用findstr对比剩下的文本,生成的文本就是余下没有分配的了。那个运算的,我实在做不出来……边上班边想吧,晚上再来。
作者: batman 时间: 2011-4-16 18:47
本帖最后由 batman 于 2011-4-18 10:44 编辑
怎么没有人解题了,是太难了吗?这就是一道批的实际应用题啊,相信很多人在工作中会遇到的。。。
如果新手觉得计算难了点,可以不完成计算这一步。。。
唉,要是新手望而怯步,老手们就出手吧。。。
作者: terse 时间: 2011-4-19 10:42
本帖最后由 terse 于 2011-4-19 11:24 编辑
没测试
简化下计算
另跳格键 需自己改- @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
复制代码
作者: 舒待子 时间: 2011-4-19 11:11
没测试
@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
好!
作者: batman 时间: 2011-4-19 12:29
唉望眼欲穿啊,下面是本人出题前的解(注意替换tab):- @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
复制代码
作者: 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文件的生成 还是用个过度吧 效率上可提升点- @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
复制代码
作者: qzwqzw 时间: 2011-4-20 15:09
小知识:批可以直接生成xls文件,也可对生成的xls进行重操作,前提是你装了office。。。
batman 发表于 2011-4-15 11:08
怎么感觉大家都在直接echo输出xls文件?
这应该是以制表符分隔的文本文件吧
还以为会用VBS脚本呢
真以为取了个xls的扩展名就是excel文件了
作者: caruko 时间: 2011-4-20 20:46
这么来说,直接写excel宏来做更高效吧..
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |