Board logo

标题: [文本处理] [已解决] 批处理怎样从文本中提取字符串? [打印本页]

作者: xudaweb    时间: 2011-9-21 20:48     标题: [已解决] 批处理怎样从文本中提取字符串?

本帖最后由 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不需要的也提取进来了!感觉这样的逻辑有问题,请各位给个思路。
作者: FOR    时间: 2011-9-21 21:05

逐行读取,当前行为 test-A 或 B 时,做个标记,则提取下一行。
作者: garyng    时间: 2011-9-21 21:45

用for、find就应该可以的~
作者: xudaweb    时间: 2011-9-22 21:03

怎么根据查找到特定行的字符来提取下一行的字符串呢?谁能给个思路?
作者: JooKin    时间: 2011-9-23 01:41

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

作者: hankerer    时间: 2011-9-23 10:28

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

作者: hfg1977    时间: 2011-9-23 18:33

本帖最后由 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]
作者: xudaweb    时间: 2011-9-23 18:35

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

回复 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. 请按任意键继续. . .
复制代码
你的版本跟我不一样吧==!
作者: hfg1977    时间: 2011-9-23 20:43

回复 9# JooKin

额,我的4.2版不支持"'"符号.
作者: FOR    时间: 2011-9-30 16:04

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

作者: Batcher    时间: 2011-9-30 16:22

回复 10# hfg1977


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




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