标题: 【练习-069】批处理按要求提取字符串 [打印本页]
作者: batman 时间: 2012-3-27 10:46 标题: 【练习-069】批处理按要求提取字符串
本帖最后由 batman 于 2012-3-27 11:41 编辑
出题目的:
加强大家对批处理实际应用的认识(大家完成后会认识到批解决这个问题居然是这么简单!)
加分原则:
满分10分,其中思路5分,代码简洁3分,书写规范2分
解题要求:
限批处理新手做答,其他可跟帖讨论
题目如下:
本人在工作中经常要对数据进行区域划分,一般本人是用的以下excel函数公式
=IF(TRIM(MID(SUBSTITUTE(A1,"-->",REPT(" ",LEN(A1))),3*LEN(A1),LEN(A1)))="株洲县区域营销中心",TRIM(MID(SUBSTITUTE(A1,"-->",REPT(" ",LEN(A1))),4*LEN(A1),LEN(A1))),TRIM(MID(SUBSTITUTE(A1,"-->",REPT(" ",LEN(A1))),5*LEN(A1),LEN(A1))))(是不是非常复杂)
现在想要大家用批处理来完成这一步骤,a.txt中全是形如湖南电信省公司-->株洲本地网-->株州县分公司-->株洲县农村营销中心-->株洲县雷打石支局-->株洲县雷打石伞铺信息服务站-->家庭客户组-->雷打石东林村的字符串,如以-->做为分隔,如果第四列中为株洲县区域营销中心字符串,则取第五列字符串,否则取第六列数据,并输出数据到屏幕。
作者: apang 时间: 2012-3-27 12:42
本帖最后由 apang 于 2012-3-27 13:23 编辑
- @echo off
- for /f "tokens=4,5,6 delims=-->" %%a in (a.txt) do (
- if "%%a"=="株洲县区域营销中心" (echo %%b) else echo %%c
- )
- pause
复制代码
作者: 冷玉公子 时间: 2012-3-27 21:35
- @Echo Off
-
- Set "Ad=株洲县农村营销中心"
-
- For /F "tokens=1-30 delims=-->" %%1 In (Log.txt) Do (
- If "%%4"=="%Ad%" (
- Echo 找到字符:%Ad% 输出: %%5
- )Else (
- Echo 未找到字符:%Ad% 输出: %%6
- )
- )
- Pause>Nul
复制代码
只能这样了,跟二楼的基本上是一样的。
批处理处理文本,好像就是For /F了。
这样写,更清楚一下标题。哈哈
作者: batman 时间: 2012-3-28 08:25
回复 3# 冷玉公子
tokens=1-30有必要?还有和二楼犯同样的错误delims=-->应是delims=->
作者: qzwqzw 时间: 2012-3-28 09:38
回复 1# batman
题外
excel处理这个问题也没有那么复杂
1.导入数据选择a.txt并按分隔符"->"分列
2.第一行公式中输入 if(d1="株洲县区域营销中",e1,f1)
3.向下复制单元格公式
作者: batman 时间: 2012-3-28 12:20
回复 6# qzwqzw
我的原始数据是有n列的,然后根据这个字段来划分区域,所以老兄说的这种方法是不行的。。。
作者: 冷玉公子 时间: 2012-3-28 12:49
回复 7# batman
苦思木有其他方法啊,楼主写个其他的方法呗。
作者: qzwqzw 时间: 2012-3-28 13:40
回复 7# batman
只是提供一个思路而已
满足你的题设要求
如果情况比较复杂
那么显然批处理也不会太轻松解决
单纯就分列的问题提供建议
在需要处理的列后插入足够的临时列
如果需要打印隐藏这些列即可
作者: batman 时间: 2012-3-28 20:58
本帖最后由 batman 于 2012-3-28 22:30 编辑
回复 8# 冷玉公子
另一种方法,不过有点自己绕的感觉,但终究是一种思路(适用于tokens超过32列极限的情况):- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"&set "str=!str:-->= !"&set /a n=0
- for %%a in (!str!) do (
- if defined flag echo %%a&set "flag="&set /a n+=1
- set /a n+=1
- if !n! equ 4 if "%%a" equ "株洲县区域营销中心" set "flag=a"
- if !n! equ 5 set "flag=a"
- )
- )
- pause>nul
复制代码
作者: apang 时间: 2012-3-28 23:29
- @echo off
- for /f "delims=" %%a in (a.txt) do (
- set "var=%%a"
- call :lp %%var:--^>= %%
- )
- pause
-
- :lp
- if "%4"=="株洲县区域营销中心" (echo %5) else echo %6
复制代码
开始我这样写的,后来我又改了。
作者: batman 时间: 2012-3-29 09:13
回复 11# apang
兄弟这样处理的话要是目标列超过9列就没有办法了,因为call只能传递0-9总共10个参数(其中%0是指脚本本身)。。。
作者: apang 时间: 2012-3-29 14:20
回复 12# batman
超过9列也可以,这个我试过了。假设题目总共有39列,现在要求:第35列中为株洲县区域营销中心字符串,则取第36列字符串,否则取第37列数据- @echo off
- for /f "delims=" %%a in (a.txt) do (
- set "var=%%a"
- call :lp %%var:--^>= %%
- )
- pause
-
- :lp
- for /l %%b in (1 1 34) do shift
- if "%1"=="株洲县区域营销中心" (echo %2) else echo %3
复制代码
作者: lance_man 时间: 2013-4-11 11:04
有没有 替代字符串的?
作者: liushenchi 时间: 2013-4-18 10:51
我要发帖求助啊,积分啊
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |