找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21087|回复: 2

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

[复制链接]
发表于 2012-3-26 08:51:36 | 显示全部楼层 |阅读模式
文本如下  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:50:21 | 显示全部楼层
本帖最后由 冷玉公子 于 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 ...
这样的
 楼主| 发表于 2012-3-27 18:47:16 | 显示全部楼层
顶起……看看有没有新思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 00:50 , Processed in 0.026162 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表