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

[文本处理] 批处理如何以空行为分隔提取文本?

文本如下  a.txt
  1. xxxx
  2. ......(中间行数不定)
  3. [aaa]
  4. bbb
  5. ccc
  6. ...(行数不定,内容不定)
  7. ddd
  8. [..]
  9. ......(不定)
复制代码
解释一下:文本内容不定,格式为
[标题]
内容1

[标题2]
内容2
以下是我的写法:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. del t.txt
  4. findstr /n .* a.txt>>t.txt
  5. for /f "delims=:" %%i in ('findstr aaa  t.txt') do (
  6. set /a begin=%%i+1
  7. for /f "delims=: tokens=1,*" %%a in (t.txt) do (
  8. if %%a==!begin! (
  9. set /a begin+=1
  10. set f=%%b
  11. if not defined f goto end
  12. echo %%b
  13. )
  14. )
  15. )
  16. pause
  17. :end
  18. pause
复制代码
就是说先打印行号,找到AAA的航标,然后+1 +1 +1 ...直到发现空行跳出
由于是嵌套在for里 实现需要call然后又在eof出来,感觉不是很方便
希望大家提供一个新方法~

本帖最后由 冷玉公子 于 2012-3-26 10:56 编辑

如果木有猜错,你是想像读取INI配置文件那样的吧。
不要用这样的思路,应该是一个For 加上 If 就要解决的问题。
要习惯尽量使用内置函数解决问题啊,这样你的脚本执行速度才会达到最快。

首先做一个函数,例如:Call Ini_Read aaa aaa1
@Rem: aaa 是《键名》 aaa1 是《值》
[aaa]
aaa1=我是中国人
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. Call :_Ini_Read Log.txt aaa aaa1
  3. Echo.
  4. Echo 执行结束
  5. Pause>Nul
  6. Exit
  7. :_Ini_Read
  8. For /F %%A In (%1) Do (
  9. Set "Content=%%A"
  10. If "!Content!" == "[%2]" Set "Read=True"
  11. If "!Read!" == "True" (
  12. If "!Start!" == "True" If "!Content:~,1!" == "[" Echo 未找到&&Set "Start=False"&&Goto :Eof
  13. For /F "tokens=1,2 delims==" %%1 In ("!Content!") Do (
  14. If "%%1" == "%3" Echo %%2&&Set "Read=False"&&Goto :Eof
  15. )
  16. Set "Start=True"
  17. )
  18. )
复制代码
我这个方法只是举个大概例子,你可以再增加修改就可以了。
还有如果是真的需要用findstr也尽量嵌套在for里,避免输出临时文件。
For /f %%a In ('Findstr /n .* aaa.txt') Do ...
这样的

TOP

顶起……看看有没有新思路

TOP

返回列表