[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理delims怎样取出最后一段?变量延迟怎样输出感叹号?

1.用for /f "delims=分隔符"这样,要怎么取出最后一段,或倒数第二段
假设文件里有这样一些内容:
北京,海淀,XX街20号,100010,张三
上海,浦东,市郊A县,B小镇,C村,234号,200002,李四
广州,白云区,XX大道,某大厦503,300003,王五

文件中字段间以逗号分隔,每行的段数不一定相等
要取出倒数第二段的邮编与最后一段姓名,怎么做?
我现在用这样子,可以取出所有的段,但是要每段都去判断是否为空,才知道哪个才是最后一段,有没有直接取出最后一段或倒数第二段的办法?
  1. for /f "delims=, tokens=1-20" %%a in (文件名) do (
  2. )
复制代码
2.还是在for里面. 当使用了变量延迟后,echo 就打不出变量里面的感叹号了
举个例子说明:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f  %%a in (文件名) do (
  4. echo 这行内容为[%%a]
  5. ::当文件中这行的内容里面有'!',它是显示不出来的,这个怎么解决.
  6. )
复制代码
望高手不吝赐教,先谢谢了!
同时感谢关注这个贴子和帮顶的网友们.
1

评分人数

    • tmplinshi: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 wc726842270 于 2011-3-28 10:24 编辑

1
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (set a=%%i&set b=!a:,= !
  3.   (for %%j in (!b!) do set a=!b!&set b=%%j)&&echo !a! !b! >>b.txt
  4. )
  5. pause
复制代码
2,能否把setlocal enabledelayedexpansion放在最需要它的地方呢,如果有必要在加上结束延迟的语句
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

处理特殊字符的几种方法
http://bbs.bathome.net/thread-1224-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

谢谢wc726842270 的回复!
1.思路是子循环中读取一行中的所有段,前一个循环的当前段的值设为倒数第二段,本次循环的当前段的值设为最为最后一段,走完子循环就取出了倒数第二段与最后一段. 我理解得正确吗?

2.问题在于..如果不用变量延迟,for里面就不能echo,如果用了,就打不出'感叹号'..

TOP

4# o准星o


3楼不是有处理感叹号的方法么?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

4# o准星o
你的词用的很不恰当啊,要分清段和列,行的区别啊,弄晕了。不过大体就是这个意思
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. for %%b in (%%a) do  set last=!new!&set new=%%b
  4. )
  5. echo %last% %new%
  6. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ("123,435,678") do (
  3. set tmp=%%a
  4. for /f "tokens=1,2" %%b in ("!tmp:,=\!\.. !tmp:,=\!") do echo %%~nxb@%%~nc
  5. )
  6. pause
复制代码

TOP

本帖最后由 o准星o 于 2011-3-28 14:59 编辑

3# Batcher


谢谢管理员的回复. 可能是我网速比慢,4楼的时候没见到您3楼的回复.

看完<批处理中处理特殊字符的几种方法>的贴子之后,试验了一下,发现在for里面设置变量延迟,并关闭. 可以输出感叹号'!'
但是,如果在循环外要用到这里面的变量值呢? 怎么办?

比如有这么一个文本:
  1. 北京:
  2. 天安门
  3. 故宫
  4. 上海:
  5. 东方明珠
  6. 世博园
  7. hello world!
复制代码
我的代码:
  1. @echo off
  2. set areaflag=空
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (d:\a.txt) do (
  5. set "str=%%i"
  6. if "!str:上海=!" neq "!str!" (
  7. set areaflag=上海开始
  8. )
  9. if "!areaflag!" == "上海" (
  10. echo 上海有[!str!]
  11. )
  12. if "!areaflag!" == "上海开始" (
  13. set areaflag=上海
  14. )
  15. )
  16. :break
  17. endlocal
  18. pause >/null
复制代码
如果把endlocal放到for循环里面,areaflag的值就无法更改,这样怎么输出hello world!那行里面的感叹号

TOP

  1. @echo off
  2. set areaflag=空
  3. for /f "delims=" %%i in (d:\a.txt) do (
  4.         set "str=%%i"
  5.         setlocal enabledelayedexpansion
  6.         if "!str:上海=!" neq "!str!" set areaflag=上海开始
  7.         if defined areaflag if "!areaflag!" == "上海" (
  8.                 echo 上海有[!str!]
  9.         ) else set areaflag=上海
  10.      for %%z in ("!areaflag!") do endlocal&set areaflag=%%~z
  11. )
  12. pause >/null
复制代码
1

评分人数

TOP

9# zm900612


感谢zm900612的回复! 代码很有效!

如果我有多层for嵌套,又该怎么做呢?
把代码中的echo 上海有[!str!]
for /f "delims=" %%a in ("!str!") do (
        echo 上海有[%%a]
)

TOP

9# zm900612


感谢zm900612的回复!  巧妙地把变量给存下来了!

如果我有多层for嵌套,感叹号又打不出来了...

把代码改为:
  1. @echo off
  2. set areaflag=空
  3. for /f "delims=" %%i in (d:\a.txt) do (
  4. set "str=%%i"
  5. setlocal enabledelayedexpansion
  6. if "!str:上海=!" neq "!str!" set areaflag=上海开始
  7. if defined areaflag if "!areaflag!" == "上海" (
  8. for /f "delims=" %%a in ("!str!") do (
  9. echo 上海有[%%a]
  10. )
  11. )
  12. if "!areaflag!" == "上海开始" set areaflag=上海
  13. for %%z in ("!areaflag!") do endlocal&set areaflag=%%~z
  14. )
  15. pause >/null
复制代码

TOP

其实也是同理,当然也可以不要变量延迟,改用call,不过那样太慢了。
按题解题,11楼代码可以直接用echo !str!,不需要for,变量扩展的结果就算含!也不会被当成变量

TOP

本帖最后由 zm900612 于 2011-3-28 19:31 编辑

如果非要用变量延迟,可以用:
call %%str%%
或者
  1. for /f "delims=" %%a in ("!str!") do (
  2.               setlocal disabledelayedexpansion
  3.                         echo 上海有[%%a]
  4.               endlocal
  5.                 )
复制代码
endlocal和setlocal是一一对应的,有点像堆栈,新的endlocal只会影响尚存的最近的setlocal,不会影响在此之前的旧变量

TOP

我只是举个例子,说 嵌套循环中不能打出'!'

我在每个for里面都加了开关,但始终打不出感叹号...

TOP

返回列表