Board logo

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

作者: o准星o    时间: 2011-3-28 10:06     标题: 批处理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. )
复制代码
望高手不吝赐教,先谢谢了!
同时感谢关注这个贴子和帮顶的网友们.
作者: wc726842270    时间: 2011-3-28 10:21

本帖最后由 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放在最需要它的地方呢,如果有必要在加上结束延迟的语句
作者: 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

  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
复制代码

作者: o准星o    时间: 2011-3-28 14:37

本帖最后由 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!那行里面的感叹号
作者: CrLf    时间: 2011-3-28 16:11

  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
复制代码

作者: 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嵌套,感叹号又打不出来了...

把代码改为:
  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
复制代码

作者: 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%%
或者
  1. for /f "delims=" %%a in ("!str!") do (
  2.               setlocal disabledelayedexpansion
  3.                         echo 上海有[%%a]
  4.               endlocal
  5.                 )
复制代码
endlocal和setlocal是一一对应的,有点像堆栈,新的endlocal只会影响尚存的最近的setlocal,不会影响在此之前的旧变量
作者: o准星o    时间: 2011-3-28 19:57

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

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2