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

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

[复制链接]
发表于 2011-9-21 20:48:21 | 显示全部楼层 |阅读模式
本帖最后由 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不需要的也提取进来了!感觉这样的逻辑有问题,请各位给个思路。

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-9-21 21:05:08 | 显示全部楼层
逐行读取,当前行为 test-A 或 B 时,做个标记,则提取下一行。
发表于 2011-9-21 21:45:44 | 显示全部楼层
用for、find就应该可以的~

评分

参与人数 1PB +3 收起 理由
CrLf + 3 乐于助人

查看全部评分

 楼主| 发表于 2011-9-22 21:03:48 | 显示全部楼层
怎么根据查找到特定行的字符来提取下一行的字符串呢?谁能给个思路?
发表于 2011-9-23 01:41:12 | 显示全部楼层

  1. sed -n '/test-[AB]/{n;s/.*Measured: \(.*\) low.*/\1/p}' 1.txt
复制代码
发表于 2011-9-23 10:28:46 | 显示全部楼层
  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. )

  21. 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技术 +1 收起 理由
xudaweb + 1 谢谢!学习了~

查看全部评分

发表于 2011-9-23 18:33:45 | 显示全部楼层
本帖最后由 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]
 楼主| 发表于 2011-9-23 18:35:21 | 显示全部楼层
目前我用的算法比较弱智,暂时将就处理。
1. 导出需要查找的特殊字符串的行,计算行数即为测量值的个数
2. 导出所有测量值,截取需要的测量值的个数。
这样的算法弊端很大,假如需要查找的字符串不在开头就不方便提取了。
学习下高手的算法!要是有注释就更好了...
发表于 2011-9-23 20:27:24 | 显示全部楼层
回复 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技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

发表于 2011-9-23 20:43:11 | 显示全部楼层
回复 9# JooKin

额,我的4.2版不支持"'"符号.
发表于 2011-9-30 16:04:34 | 显示全部楼层
  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技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

发表于 2011-9-30 16:22:18 | 显示全部楼层
回复 10# hfg1977


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

评分

参与人数 1PB +3 收起 理由
CrLf + 3 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 05:08 , Processed in 0.031619 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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