中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-28 23:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]如何提取特定字符后的固定长度字符 查看 1,795 回复 18
楼 主 [求助]如何提取特定字符后的固定长度字符 发表于 2007-11-13 17:42 ·  美国
初级用户
积分 34
发帖 12
注册 2007-01-04 22:58
19年会员
UID 75448
性别 男
状态 离线
文本文件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自带的命令啊,各位先进有没有办法啊?
2 发表于 2007-11-13 18:09 ·  中国 北京 海淀区 联通
银牌会员
★★★
积分 1,287
发帖 634
注册 2007-05-02 15:06
19年会员
UID 87277
性别 男
来自 cmd.exe
状态 离线
用FOR按空格分割.
对分割出的每一个元素的第一个字符进行判断.
3 发表于 2007-11-13 18:52 ·  中国 云南 昆明 联通
初级用户
积分 90
发帖 43
注册 2007-10-31 11:00
18年会员
UID 101268
性别 男
状态 离线
楼上说的是对的,补充一点
delims=:@
4 发表于 2007-11-14 11:51 ·  美国
初级用户
积分 34
发帖 12
注册 2007-01-04 22:58
19年会员
UID 75448
性别 男
状态 离线
试过不行啊,不能遍厉整个文本文件,只取得一行的第一个含有@的编号,后面的就找不到,能给个详细的For语句实现吗
5 发表于 2007-11-14 13:04 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
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
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
zqdarkday +2 2007-11-18 00:57
6 发表于 2007-11-14 15:38 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
::

@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
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
zqdarkday +2 2007-11-17 13:01
致精致简!
7 发表于 2007-11-14 15:40 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
没注意 lxmxn 版主已经发了,比我的简洁多了。
致精致简!
8 发表于 2007-11-16 14:52 ·  美国
初级用户
积分 34
发帖 12
注册 2007-01-04 22:58
19年会员
UID 75448
性别 男
状态 离线
版主的For代码测试了二天都验正结果正确,版主真是牛人啊 太感谢了
9 发表于 2007-11-17 13:01 ·  中国 湖北 武汉 电信
中级用户
★★
积分 210
发帖 79
注册 2007-04-14 10:49
19年会员
UID 85130
性别 男
来自 湖北
状态 离线
to lxmxn 斑竹
有个问题想问下,你所写的这个代码我有个地方想不通
就是for for %%b in (%%a) do
的时候for不是提取的是一整行吗
最后为什么能把一行中的几段分别提出来呢?是if语句起的作用吗?到底是什么原因
请告诉小弟一下!
谢谢了
10 发表于 2007-11-17 13:07 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
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 \ ,看得到什么结果。
11 发表于 2007-11-17 14:03 ·  中国 北京 联通
中级用户
★★
替身
积分 269
发帖 130
注册 2007-03-23 21:41
19年会员
UID 82683
性别 女
状态 离线
玩儿......................................

@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 ]
12 发表于 2007-11-17 15:10 ·  中国 湖北 武汉 电信
中级用户
★★
积分 210
发帖 79
注册 2007-04-14 10:49
19年会员
UID 85130
性别 男
来自 湖北
状态 离线
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只能显示第一个
这样是怎样的原理啊,谢谢哦
13 发表于 2007-11-17 17:38 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
for /f 的时候默认是取第一个元素的,所以只能显示一个。。
14 发表于 2007-11-17 20:56 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
TO zqdarkday:

你修改了这个格式其实用我5楼的代码同样适用。。。
15 发表于 2007-11-17 21:18 ·  中国 湖北 武汉 电信
中级用户
★★
积分 210
发帖 79
注册 2007-04-14 10:49
19年会员
UID 85130
性别 男
来自 湖北
状态 离线
re zqdarkday
能不能把具体代码发上来让我看下吗?
谢谢哦
论坛跳转: