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

[文本处理] [已解决] 批处理怎样从文本中提取字符串?

本帖最后由 xudaweb 于 2011-9-26 18:24 编辑

描述下遇到的问题:
在测试记录的txt中,有如下固定格式的文本(其中test-A,test-B,test-C,test-D都有很多个)
  1.    
  2. test-A, 0 volts.
  3.             Measured: 0.0001293 low limit: -0.2 high limit: 0.2           
  4. test-A, 0 volts.
  5.             Measured: 0.0001294 low limit: -0.2 high limit: 0.2
  6.            
  7. test-B, 200 na.
  8.             Measured: 0.000002 low limit: 1 high limit: 2           
  9. test-B, 200 na.
  10.             Measured: -0.000001999 low limit: -2 high limit: -1
  11.                           
  12. test-C
  13.             Measured: 1.995 expected: 1.995
  14. test-D
  15.             Measured: -17.011 expected: -17.011
复制代码
现在需要把所有test-A,test-B的项目下测量值全部提取出来,希望得到的结果如下:
  1. 0.0001293
  2. 0.0001294
  3. rem 此处略去很多...
  4. 0.000002000
  5. -0.000001999
  6. rem 此处略去很多...
复制代码
经自己摸索,现在仅能把所有包含Measured的行,提取出来后,再提取出后面测量的数值。
但是test-C,test-D不需要的也提取进来了!感觉这样的逻辑有问题,请各位给个思路。
1

评分人数

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

逐行读取,当前行为 test-A 或 B 时,做个标记,则提取下一行。

TOP

用for、find就应该可以的~
1

评分人数

    • CrLf: 乐于助人PB + 3

TOP

怎么根据查找到特定行的字符来提取下一行的字符串呢?谁能给个思路?
学习...

TOP

  1. sed -n '/test-[AB]/{n;s/.*Measured: \(.*\) low.*/\1/p}' 1.txt
复制代码

TOP

  1. @echo off
  2. SETLOCAL enabledelayedexpansion
  3. set flag1=0
  4. set flag2=0
  5. for /f "tokens=* delims=" %%i in (a.txt) do (
  6. set "a=%%i"
  7. set "b=!a:test-A=!"
  8. if not "!a!" == "!b!" set flag1=1
  9. set "b=!a:test-B=!"
  10. if not "!a!" == "!b!" set flag1=1
  11. if !flag2! == 1 (
  12. set flag2=0
  13. for /f "tokens=2 delims=: " %%a in ("%%i") do >>b.txt echo %%a
  14. )
  15. if !flag1! == 1 (
  16. set flag2=1
  17. set  flag1=0
  18. )
  19. )
  20. pause
复制代码
用下面的测试文本
  1. test-A, 0 volts.
  2.             Measured: 0.0001293 low limit: -0.2 high limit: 0.2           
  3. test-A, 0 volts.
  4.             Measured: 0.0001294 low limit: -0.2 high limit: 0.2
  5.            
  6. test-B, 200 na.
  7.             Measured: 0.000002 low limit: 1 high limit: 2           
  8. test-B, 200 na.
  9.             Measured: -0.000001999 low limit: -2 high limit: -1
  10.                           
  11. test-C
  12.             Measured: 1.995 expected: 1.995
  13. test-D
  14.             Measured: -17.011 expected: -17.011
复制代码
得到结果
  1. 0.0001293
  2. 0.0001294
  3. 0.000002
  4. -0.000001999
复制代码
1

评分人数

    • xudaweb: 谢谢!学习了~技术 + 1

TOP

本帖最后由 hfg1977 于 2011-9-23 19:19 编辑

回复 5# JooKin


    你的代码有没有测试呀, 什么版本的"CMD" 用'限制符?
re:5L的要把空白行去掉就可以了.
  1. sed -n "/Measured/ s/Measured:[ ]\(-\?[0-9]\+\.[0-9]\+\).*/\1/p" 01.txt
复制代码
只保留AB的


[code]
sed -n "/Measured/ s/Measured:[ ]\(-\?[0-9]\+\.[0-9]\+\)[ ]low.*/\1/p" 01.txt
[\code]
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

目前我用的算法比较弱智,暂时将就处理。
1. 导出需要查找的特殊字符串的行,计算行数即为测量值的个数
2. 导出所有测量值,截取需要的测量值的个数。
这样的算法弊端很大,假如需要查找的字符串不在开头就不方便提取了。
学习下高手的算法!要是有注释就更好了...
学习...

TOP

回复 7# hfg1977


    已测试通过,我的sed版本:sed.exe 4.1.4
  1. @echo off
  2. sed -n '/test-[AB]/{n;s/.*Measured: \(.*\) low.*/\1/p}' 1.txt
  3. pause
复制代码
结果:
  1. 0.0001293
  2. 0.0001294
  3. 0.000002
  4. -0.000001999
  5. 请按任意键继续. . .
复制代码
你的版本跟我不一样吧==!
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 9# JooKin

额,我的4.2版不支持"'"符号.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

  1. # 2>nul&@echo off&cls&gawk -f "%~fs0" a.txt&pause
  2. {
  3. if (i==1){i=0;print $2}
  4. if ($1=="test-A,") {i=1}
  5. if ($1=="test-B,") {i=1}
  6. }
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 10# hfg1977


都不支持单引号的,估计是他笔误了。
1

评分人数

    • CrLf: 乐于助人PB + 3
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表