标题: [文本处理] 批处理delims怎样取出最后一段?变量延迟怎样输出感叹号? [打印本页]
作者: o准星o 时间: 2011-3-28 10:06 标题: 批处理delims怎样取出最后一段?变量延迟怎样输出感叹号?
1.用for /f "delims=分隔符"这样,要怎么取出最后一段,或倒数第二段
假设文件里有这样一些内容:
北京,海淀,XX街20号,100010,张三
上海,浦东,市郊A县,B小镇,C村,234号,200002,李四
广州,白云区,XX大道,某大厦503,300003,王五
文件中字段间以逗号分隔,每行的段数不一定相等
要取出倒数第二段的邮编与最后一段姓名,怎么做?
我现在用这样子,可以取出所有的段,但是要每段都去判断是否为空,才知道哪个才是最后一段,有没有直接取出最后一段或倒数第二段的办法?- for /f "delims=, tokens=1-20" %%a in (文件名) do (
-
- )
复制代码
2.还是在for里面. 当使用了变量延迟后,echo 就打不出变量里面的感叹号了
举个例子说明:- @echo off
- setlocal enabledelayedexpansion
- for /f %%a in (文件名) do (
- echo 这行内容为[%%a]
- ::当文件中这行的内容里面有'!',它是显示不出来的,这个怎么解决.
- )
复制代码
望高手不吝赐教,先谢谢了!
同时感谢关注这个贴子和帮顶的网友们.
作者: wc726842270 时间: 2011-3-28 10:21
本帖最后由 wc726842270 于 2011-3-28 10:24 编辑
1- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (set a=%%i&set b=!a:,= !
- (for %%j in (!b!) do set a=!b!&set b=%%j)&&echo !a! !b! >>b.txt
- )
- pause
复制代码
2,能否把setlocal enabledelayedexpansion放在最需要它的地方呢,如果有必要在加上结束延迟的语句
作者: Batcher 时间: 2011-3-28 11:17
处理特殊字符的几种方法
http://bbs.bathome.net/thread-1224-1-1.html
作者: o准星o 时间: 2011-3-28 11:33
谢谢wc726842270 的回复!
1.思路是子循环中读取一行中的所有段,前一个循环的当前段的值设为倒数第二段,本次循环的当前段的值设为最为最后一段,走完子循环就取出了倒数第二段与最后一段. 我理解得正确吗?
2.问题在于..如果不用变量延迟,for里面就不能echo,如果用了,就打不出'感叹号'..
作者: Batcher 时间: 2011-3-28 11:41
4# o准星o
3楼不是有处理感叹号的方法么?
作者: wc726842270 时间: 2011-3-28 12:53
4# o准星o
你的词用的很不恰当啊,要分清段和列,行的区别啊,弄晕了。不过大体就是这个意思
作者: CrLf 时间: 2011-3-28 13:46
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- for %%b in (%%a) do set last=!new!&set new=%%b
- )
- echo %last% %new%
- pause
复制代码
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ("123,435,678") do (
- set tmp=%%a
- for /f "tokens=1,2" %%b in ("!tmp:,=\!\.. !tmp:,=\!") do echo %%~nxb@%%~nc
- )
- pause
复制代码
作者: o准星o 时间: 2011-3-28 14:37
本帖最后由 o准星o 于 2011-3-28 14:59 编辑
3# Batcher
谢谢管理员的回复. 可能是我网速比慢,4楼的时候没见到您3楼的回复.
看完<批处理中处理特殊字符的几种方法>的贴子之后,试验了一下,发现在for里面设置变量延迟,并关闭. 可以输出感叹号'!'
但是,如果在循环外要用到这里面的变量值呢? 怎么办?
比如有这么一个文本:- 北京:
- 天安门
- 故宫
-
- 上海:
- 东方明珠
- 世博园
- hello world!
复制代码
我的代码:- @echo off
-
- set areaflag=空
-
- setlocal enabledelayedexpansion
-
- for /f "delims=" %%i in (d:\a.txt) do (
-
- set "str=%%i"
-
- if "!str:上海=!" neq "!str!" (
-
- set areaflag=上海开始
-
- )
-
- if "!areaflag!" == "上海" (
-
- echo 上海有[!str!]
- )
-
- if "!areaflag!" == "上海开始" (
-
- set areaflag=上海
- )
-
-
- )
-
- :break
- endlocal
-
- pause >/null
复制代码
如果把endlocal放到for循环里面,areaflag的值就无法更改,这样怎么输出hello world!那行里面的感叹号
作者: CrLf 时间: 2011-3-28 16:11
- @echo off
- set areaflag=空
- for /f "delims=" %%i in (d:\a.txt) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- if "!str:上海=!" neq "!str!" set areaflag=上海开始
- if defined areaflag if "!areaflag!" == "上海" (
- echo 上海有[!str!]
- ) else set areaflag=上海
- for %%z in ("!areaflag!") do endlocal&set areaflag=%%~z
- )
- pause >/null
复制代码
作者: o准星o 时间: 2011-3-28 18:40
9# zm900612
感谢zm900612的回复! 代码很有效!
如果我有多层for嵌套,又该怎么做呢?
把代码中的echo 上海有[!str!]
for /f "delims=" %%a in ("!str!") do (
echo 上海有[%%a]
)
作者: o准星o 时间: 2011-3-28 18:48
9# zm900612
感谢zm900612的回复! 巧妙地把变量给存下来了!
如果我有多层for嵌套,感叹号又打不出来了...
把代码改为:
- @echo off
-
- set areaflag=空
-
- for /f "delims=" %%i in (d:\a.txt) do (
-
- set "str=%%i"
-
- setlocal enabledelayedexpansion
-
- if "!str:上海=!" neq "!str!" set areaflag=上海开始
-
- if defined areaflag if "!areaflag!" == "上海" (
-
- for /f "delims=" %%a in ("!str!") do (
- echo 上海有[%%a]
- )
-
- )
-
- if "!areaflag!" == "上海开始" set areaflag=上海
-
- for %%z in ("!areaflag!") do endlocal&set areaflag=%%~z
-
- )
- pause >/null
复制代码
作者: CrLf 时间: 2011-3-28 19:18
其实也是同理,当然也可以不要变量延迟,改用call,不过那样太慢了。
按题解题,11楼代码可以直接用echo !str!,不需要for,变量扩展的结果就算含!也不会被当成变量
作者: CrLf 时间: 2011-3-28 19:29
本帖最后由 zm900612 于 2011-3-28 19:31 编辑
如果非要用变量延迟,可以用:
call %%str%%
或者- for /f "delims=" %%a in ("!str!") do (
- setlocal disabledelayedexpansion
- echo 上海有[%%a]
- endlocal
- )
复制代码
endlocal和setlocal是一一对应的,有点像堆栈,新的endlocal只会影响尚存的最近的setlocal,不会影响在此之前的旧变量
作者: o准星o 时间: 2011-3-28 19:57
我只是举个例子,说 嵌套循环中不能打出'!'
我在每个for里面都加了开关,但始终打不出感叹号...
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |