Board logo

标题: 【练习-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 编辑
  1. @echo off
  2. for /f "tokens=4,5,6 delims=-->" %%a in (a.txt) do (
  3.   if "%%a"=="株洲县区域营销中心" (echo %%b) else echo %%c
  4. )
  5. pause
复制代码

作者: 冷玉公子    时间: 2012-3-27 21:35

  1. @Echo Off
  2. Set "Ad=株洲县农村营销中心"
  3. For /F "tokens=1-30 delims=-->" %%1 In (Log.txt) Do (
  4. If "%%4"=="%Ad%" (
  5. Echo 找到字符:%Ad% 输出: %%5
  6. )Else (
  7. Echo 未找到字符:%Ad% 输出: %%6
  8. )
  9. )
  10. 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列极限的情况):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set "str=%%a"&set "str=!str:-->= !"&set /a n=0
  4.   for %%a in (!str!) do (
  5.     if defined flag echo %%a&set "flag="&set /a n+=1
  6.     set /a n+=1
  7.     if !n! equ 4 if "%%a" equ "株洲县区域营销中心" set "flag=a"
  8.     if !n! equ 5 set "flag=a"
  9.   )
  10. )
  11. pause>nul
复制代码

作者: apang    时间: 2012-3-28 23:29

  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set "var=%%a"
  4.   call :lp %%var:--^>= %%
  5. )
  6. pause
  7. :lp
  8. 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列数据
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set "var=%%a"
  4.   call :lp %%var:--^>= %%
  5. )
  6. pause
  7. :lp
  8. for /l %%b in (1 1 34) do shift
  9. 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