中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]如何提取特定字符后的固定长度字符
<<   [1] [2]  >>   >
作者:
标题: [求助]如何提取特定字符后的固定长度字符 上一主题 | 下一主题
gskuser
初级用户





积分 34
发帖 12
注册 2007-1-4
状态 离线
『楼 主』:  [求助]如何提取特定字符后的固定长度字符

文本文件1.txt如下内容如下,各编号之间是用空格分开: SH:212655 213425 @213455 @213459 213521 ........ BJ:101228 @101325 101329 @101352 @101365 ........ GZ:@200231 200255 @200268 @200286 200301 ........ XA: ........ HM: ......... : .......... : .......... : .......... 要的就是将含有@的6位固定长度编号存入变量中进行处理,如上面的@213455,@213459,@200286等等,而含有@的编号位置没有规律的, 想用For的批处理,如for /f "tokens=2 delims=@"。。。但实现不了,在论坛找了一天也找不到解决办法, 因为代码上头要审查,不能用SED或其它等第三方工具,只能用XP下DOS自带的命令啊,各位先进有没有办法啊?


2007-11-13 17:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 2 楼』:  

用FOR按空格分割. 对分割出的每一个元素的第一个字符进行判断.


2007-11-13 18:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
genteman
初级用户





积分 90
发帖 43
注册 2007-10-31
状态 离线
『第 3 楼』:  

楼上说的是对的,补充一点 delims=:@


2007-11-13 18:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gskuser
初级用户





积分 34
发帖 12
注册 2007-1-4
状态 离线
『第 4 楼』:  

试过不行啊,不能遍厉整个文本文件,只取得一行的第一个含有@的编号,后面的就找不到,能给个详细的For语句实现吗


2007-11-14 11:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 5 楼』:  

try this code:
@echo off & SetLocal EnableDelayedExpansion

for /f "delims=: tokens=2" %%a in (1.txt) do (
    for %%b in (%%a) do (
        set string=%%b
        if "!string:~0,1!"=="@" (
            rem you can do something in this block
            echo\!string!
        )    
    )
)
pause


   此帖被 +2 点积分      点击查看详情   
评分人:【 zqdarkday 分数: +2  时间:2007-11-18 00:57


2007-11-14 13:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  

::
@echo off
for /f "delims=" %%a in (a.txt) do (
  set var=%%a
  setlocal EnableDelayedExpansion
  set shu=-1
  call :lis
  endlocal
)
pause
exit
:lis
set /a shu+=1
set num=!var:*@=!
if "!num!"=="!var:@=!" (goto :eof) else (
  echo !num:~0,6!
  set var=!num!
)
goto lis


   此帖被 +2 点积分    点击查看详情   
评分人:【 zqdarkday 分数: +2  时间:2007-11-17 13:01




致精致简!
2007-11-14 15:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  

没注意 lxmxn 版主已经发了,比我的简洁多了。




致精致简!
2007-11-14 15:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gskuser
初级用户





积分 34
发帖 12
注册 2007-1-4
状态 离线
『第 8 楼』:  

版主的For代码测试了二天都验正结果正确,版主真是牛人啊 太感谢了


2007-11-16 14:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zqdarkday
中级用户




积分 210
发帖 79
注册 2007-4-14
来自 湖北
状态 离线
『第 9 楼』:  

to lxmxn 斑竹 有个问题想问下,你所写的这个代码我有个地方想不通 就是for for %%b in (%%a) do 的时候for不是提取的是一整行吗 最后为什么能把一行中的几段分别提出来呢?是if语句起的作用吗?到底是什么原因 请告诉小弟一下! 谢谢了


2007-11-17 13:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  

RE zqdarkday:
for %%b in (%%a) do
关键是注意%%a的内容是什么格式,第一次循环时,%%a的内容就是: 212655 213425 @213455 @213459 213521 这里得到的是以空格分隔的单独的元素项,那么for不加参数时刚好可以循环迭代in后面括号中的每个元素了,再加上判断,就可以得到最终的结果了。 命令行下面试试 for %a in (c d e f g) do @echo \ %a \ ,看得到什么结果。


2007-11-17 13:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ansipeter
中级用户

替身



积分 269
发帖 130
注册 2007-3-23
状态 离线
『第 11 楼』:  

玩儿......................................
@echo off&setlocal
for /f "tokens=1* delims=:" %%a in (kk.txt) do call:9527 %%b 
goto:eof
:9527
for %%c in (%*) do echo/%%c|findstr "^@"
[ Last edited by ansipeter on 2007-11-17 at 02:05 PM ]




2007-11-17 14:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zqdarkday
中级用户




积分 210
发帖 79
注册 2007-4-14
来自 湖北
状态 离线
『第 12 楼』:  

re lxmxn 斑竹 饿,原来最基本的都忘了,谢谢了 不过我还是有个问题,还是关于for机制的 例如把1.txt的空格都改为逗号 SH:212655,213425,@213455,@213459,213521 ........ BJ:101228,@101325,101329,@101352,@101365 ........ GZ:@200231,200255,@200268,@200286,200301 ........ XA: ........ HM: ......... 这样 我写了一个类似的 @echo off & SetLocal EnableDelayedExpansion for /f "delims=: tokens=2" %%a in (1.txt) do ( for /f "delims=," %%b in ('echo %%a') do ( echo %%b set string=%%b if "!string:~0,1!"=="@" ( echo\!string! ) ) ) pause 其中%%b只能显示第一个 这样是怎样的原理啊,谢谢哦


2007-11-17 15:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 13 楼』:  

for /f 的时候默认是取第一个元素的,所以只能显示一个。。


2007-11-17 17:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 14 楼』:  

TO zqdarkday: 你修改了这个格式其实用我5楼的代码同样适用。。。


2007-11-17 20:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zqdarkday
中级用户




积分 210
发帖 79
注册 2007-4-14
来自 湖北
状态 离线
『第 15 楼』:  

re zqdarkday 能不能把具体代码发上来让我看下吗? 谢谢哦


2007-11-17 21:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: