找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25727|回复: 14

【练习-069】批处理按要求提取字符串

[复制链接]
发表于 2012-3-27 10:46:32 | 显示全部楼层 |阅读模式
本帖最后由 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中全是形如湖南电信省公司-->株洲本地网-->株州县分公司-->株洲县农村营销中心-->株洲县雷打石支局-->株洲县雷打石伞铺信息服务站-->家庭客户组-->雷打石东林村的字符串,如以-->做为分隔,如果第四列中为株洲县区域营销中心字符串,则取第五列字符串,否则取第六列数据,并输出数据到屏幕。
发表于 2012-3-27 12:42:52 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1PB +10 收起 理由
batman + 10 恩,熟练掌握了delims的用法 批就是如此简 ...

查看全部评分

发表于 2012-3-27 21:35:34 | 显示全部楼层
  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了。
这样写,更清楚一下标题。哈哈

评分

参与人数 1PB +5 收起 理由
batman + 5 画蛇添足。。。

查看全部评分

 楼主| 发表于 2012-3-28 08:25:29 | 显示全部楼层
回复 3# 冷玉公子


    tokens=1-30有必要?还有和二楼犯同样的错误delims=-->应是delims=->
发表于 2012-3-28 09:38:41 | 显示全部楼层
回复 1# batman
题外
excel处理这个问题也没有那么复杂
1.导入数据选择a.txt并按分隔符"->"分列
2.第一行公式中输入 if(d1="株洲县区域营销中",e1,f1)
3.向下复制单元格公式

评分

参与人数 1技术 +1 收起 理由
PowerShell + 1 n列的话,复制公式即可。

查看全部评分

 楼主| 发表于 2012-3-28 12:20:02 | 显示全部楼层
回复 6# qzwqzw


    我的原始数据是有n列的,然后根据这个字段来划分区域,所以老兄说的这种方法是不行的。。。
发表于 2012-3-28 12:49:43 | 显示全部楼层
回复 7# batman


    苦思木有其他方法啊,楼主写个其他的方法呗。
发表于 2012-3-28 13:40:47 | 显示全部楼层
回复 7# batman
只是提供一个思路而已
满足你的题设要求
如果情况比较复杂
那么显然批处理也不会太轻松解决

单纯就分列的问题提供建议
在需要处理的列后插入足够的临时列
如果需要打印隐藏这些列即可
 楼主| 发表于 2012-3-28 20:58:01 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2012-3-28 23:29:31 | 显示全部楼层
  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
复制代码
开始我这样写的,后来我又改了。

评分

参与人数 1PB +5 收起 理由
batman + 5 为思路加分

查看全部评分

 楼主| 发表于 2012-3-29 09:13:43 | 显示全部楼层
回复 11# apang
兄弟这样处理的话要是目标列超过9列就没有办法了,因为call只能传递0-9总共10个参数(其中%0是指脚本本身)。。。
发表于 2012-3-29 14:20:07 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1PB +5 收起 理由
batman + 5 Good

查看全部评分

发表于 2013-4-11 11:04:07 | 显示全部楼层
有没有 替代字符串的?
发表于 2013-4-18 10:51:02 | 显示全部楼层
我要发帖求助啊,积分啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:08 , Processed in 0.012562 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表