标题: [文本处理] [已解决] 批处理怎样从文本中提取字符串? [打印本页]
作者: xudaweb 时间: 2011-9-21 20:48 标题: [已解决] 批处理怎样从文本中提取字符串?
本帖最后由 xudaweb 于 2011-9-26 18:24 编辑
描述下遇到的问题:
在测试记录的txt中,有如下固定格式的文本(其中test-A,test-B,test-C,test-D都有很多个)-
- test-A, 0 volts.
- Measured: 0.0001293 low limit: -0.2 high limit: 0.2
- test-A, 0 volts.
- Measured: 0.0001294 low limit: -0.2 high limit: 0.2
-
- test-B, 200 na.
- Measured: 0.000002 low limit: 1 high limit: 2
- test-B, 200 na.
- Measured: -0.000001999 low limit: -2 high limit: -1
-
- test-C
- Measured: 1.995 expected: 1.995
-
- test-D
- Measured: -17.011 expected: -17.011
复制代码
现在需要把所有test-A,test-B的项目下测量值全部提取出来,希望得到的结果如下:- 0.0001293
- 0.0001294
- rem 此处略去很多...
- 0.000002000
- -0.000001999
- 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
- sed -n '/test-[AB]/{n;s/.*Measured: \(.*\) low.*/\1/p}' 1.txt
复制代码
作者: hankerer 时间: 2011-9-23 10:28
- @echo off
- SETLOCAL enabledelayedexpansion
- set flag1=0
- set flag2=0
- for /f "tokens=* delims=" %%i in (a.txt) do (
- set "a=%%i"
- set "b=!a:test-A=!"
- if not "!a!" == "!b!" set flag1=1
- set "b=!a:test-B=!"
- if not "!a!" == "!b!" set flag1=1
-
- if !flag2! == 1 (
- set flag2=0
- for /f "tokens=2 delims=: " %%a in ("%%i") do >>b.txt echo %%a
- )
-
- if !flag1! == 1 (
- set flag2=1
- set flag1=0
- )
-
- )
-
- pause
复制代码
用下面的测试文本- test-A, 0 volts.
- Measured: 0.0001293 low limit: -0.2 high limit: 0.2
- test-A, 0 volts.
- Measured: 0.0001294 low limit: -0.2 high limit: 0.2
-
- test-B, 200 na.
- Measured: 0.000002 low limit: 1 high limit: 2
- test-B, 200 na.
- Measured: -0.000001999 low limit: -2 high limit: -1
-
- test-C
- Measured: 1.995 expected: 1.995
-
- test-D
- Measured: -17.011 expected: -17.011
复制代码
得到结果- 0.0001293
- 0.0001294
- 0.000002
- -0.000001999
复制代码
作者: hfg1977 时间: 2011-9-23 18:33
本帖最后由 hfg1977 于 2011-9-23 19:19 编辑
回复 5# JooKin
你的代码有没有测试呀, 什么版本的"CMD" 用'限制符?
re:5L的要把空白行去掉就可以了.- 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- @echo off
- sed -n '/test-[AB]/{n;s/.*Measured: \(.*\) low.*/\1/p}' 1.txt
- pause
复制代码
结果:- 0.0001293
- 0.0001294
- 0.000002
- -0.000001999
- 请按任意键继续. . .
复制代码
你的版本跟我不一样吧==!
作者: hfg1977 时间: 2011-9-23 20:43
回复 9# JooKin
额,我的4.2版不支持"'"符号.
作者: FOR 时间: 2011-9-30 16:04
- # 2>nul&@echo off&cls&gawk -f "%~fs0" a.txt&pause
- {
- if (i==1){i=0;print $2}
- if ($1=="test-A,") {i=1}
- if ($1=="test-B,") {i=1}
- }
复制代码
作者: Batcher 时间: 2011-9-30 16:22
回复 10# hfg1977
都不支持单引号的,估计是他笔误了。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |