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

[文本处理] [已解决]bat如何查找指定字符串前的数字

[复制链接]
 楼主| 发表于 2013-10-23 00:25:43 | 显示全部楼层
回复 14# apang
apang大大,您的代码执行过后我发现一个问题,我的其中一个txt文件代码部分截取如下
D11  Final seasonally adjusted data
  From  2005.Jan to 2010.Feb
  Observations         62
-----------------------------------------------------------------------------------------------------------------------------------
               Jan      Feb      Mar      Apr      May      Jun      Jul      Aug      Sep      Oct      Nov      Dec        TOTAL  
-----------------------------------------------------------------------------------------------------------------------------------
  2005      5560.87  5591.96  5599.21  5314.09  5283.27  5257.40  5341.94  5424.71  5403.71  5445.10  5362.25  5384.08      64968.60

  2006      5299.67  5358.86  5340.71  5449.64  5472.21  5491.96  5469.75  5474.28  5603.07  5505.59  5487.61  5427.77      65381.14

  2007      5591.09  5465.43  5419.30  5502.66  5562.31  5531.94  5559.30  5563.93  5513.07  5355.59  5497.61  5477.77      66040.00

  2008      5381.09  5495.43  5649.30  5562.66  5322.31  5281.94  5069.30  5003.93  5023.07  4495.59  3837.61  4067.77      60190.00

  2009      4611.09  5055.43  5049.30  4992.66  5302.31  5401.94  5559.63  5564.00  5332.27  5554.77  5477.28  5608.04      63508.72

  2010      5653.99  5370.36                                                                                                11024.35

  AVGE      5349.63  5389.58  5411.56  5364.34  5388.48  5393.04  5399.99  5406.17  5375.04  5271.33  5132.47  5193.09

    应该是要得到5370.36(D11下面第一个AVGE,AVGE前面的第二个数),而实际运行结果是5302.31
发表于 2013-10-23 00:32:30 | 显示全部楼层
蛋疼,试试vbs先,明天再说
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. strKey ="D *11  Final seasonally adjusted data"

  3. For Each file in fso.GetFolder(".").Files
  4.     If LCase(Right(file.Name,4)) = ".txt" Then
  5.         RegEx fso.OpenTextFile(file).ReadAll
  6.     End If
  7. Next

  8. Sub RegEx(text)
  9.     Set re = New RegExp
  10.     re.Pattern = strKey & "[\s\S]+?([^ ]+) +[^ ]+\s+AVGE"
  11.     re.IgnoreCase = True
  12.     For Each a In re.Execute(text)
  13.         fso.OpenTextFile("Result.txt",8,True).WriteLine a.SubMatches(0)
  14.     Next
  15. End Sub
复制代码
发表于 2013-10-23 00:45:27 | 显示全部楼层
本帖最后由 tmplinshi 于 2013-10-23 02:04 编辑
  1. sed -n -r "/Final seasonally adjusted data/I,/AVGE/I! d; // {x; s/.* ([0-9.]+) +[0-9].*/\1/p}; /\./ h" *.txt
复制代码
如果没有 sed,请点击我签名里的链接下载。
发表于 2013-10-23 00:47:29 | 显示全部楼层
本帖最后由 foxJL 于 2013-10-23 10:21 编辑

情况太复杂,写着写着就成这样了.我在本地测试能过,希望不会再出现别的情况

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d /b /s *.txt') do (
  3.         for /f "usebackq tokens=1,* delims= " %%i in ("%%a") do (
  4.         set "n="
  5.         if defined flag (
  6.                 if /i "%%i"=="avge" (
  7.                         set "flag="
  8.                         for %%A in (!str1!) do (
  9.                                 set/a n+=1,s=n-1
  10.                                 set str_!n!=%%A
  11.                                 )
  12.                                 call echo "%%~nxa" --- %%str_!s!%%
  13.                         )
  14.                 set str1=%%j
  15.                 )
  16.         set str=%%i%%j
  17.         set str=!str: =!
  18.         if /i "!str!"=="D11Finalseasonallyadjusteddata" set flag=1
  19.         )
  20. )
  21. pause
复制代码
发表于 2013-10-23 09:20:03 | 显示全部楼层
回复 16# inflikt


    14#改一下,试试看
发表于 2013-10-23 09:27:12 | 显示全部楼层
19楼更新了一下,应该可以了吧
 楼主| 发表于 2013-10-23 10:03:48 | 显示全部楼层
回复 20# apang

apang大大,改动后测试成功,能得出正确结果,现正在学习代码中,谢谢!
 楼主| 发表于 2013-10-23 10:08:09 | 显示全部楼层
回复 21# foxJL

foxJL大大,辛苦了,您的代码我测试过,还是那个问题,如果AVGE上一行数据不够的话得不出结果,详见16#代码或是13#的附件
 楼主| 发表于 2013-10-23 10:11:44 | 显示全部楼层
回复 18# tmplinshi
  tmplinshi 大大,您的代码我测试下来跟foxJL的问题一样,就是16#代码执行不出结果,另大大辛苦了,夜里2点多还在帮我修改。
发表于 2013-10-23 10:23:44 | 显示全部楼层
回复 23# inflikt


再测试一下19楼的代码,在我本地是没有问题的.
因为公司电脑禁用了下载所以无法下载你的附件测试,只能用你16L的文本测试的.
发表于 2013-10-23 17:05:23 | 显示全部楼层
本帖最后由 tmplinshi 于 2013-10-23 17:40 编辑

sed 代码我测试没问题的,你是不是修改了代码?如果要加上 D11 的话,这样改:
  1. sed -n -r "/D\s*11\s*Final seasonally adjusted data/I,/AVGE/I! d; // {x; s/.* ([0-9.]+) +[0-9].*/\1/p}; /\./ h" *.txt
复制代码
如果结果不正确的话,最好把那个文本以附件形式上传上来。
发表于 2013-10-23 22:35:02 | 显示全部楼层
本帖最后由 terse 于 2013-10-24 15:20 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in ('dir /b/a-d *.txt') do (
  3.     set "flag="
  4.     for /f "usebackqtokens=1*" %%a in ("%%i") do (
  5.        if defined flag (
  6.             if /i "%%a" == "AVGE" (
  7.                for /f "tokens=*" %%c in ("!var: =\!\!str: =\!\..") do echo %%~nxc
  8.                set "flag="
  9.             ) else set "var=!str!"
  10.         ) else if /i "!str: =!" == "D11Finalseasonallyadjusteddata" set flag=1
  11.           set "str=%%a%%b"
  12.     )
  13. )
  14. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
非常感谢 + 1 乐于助人

查看全部评分

 楼主| 发表于 2013-10-24 11:16:19 | 显示全部楼层
回复 26# tmplinshi

似乎还是这个问题,我现在打包上来3个文件,只能得到2个数字,不知道是不是我这边的问题
 楼主| 发表于 2013-10-24 11:19:03 | 显示全部楼层
回复 27# terse

好像得出的结果很奇怪,我这边测试的3个文件,应该是得出3个数字,结果却是2个数字和一个中文。。。详见28楼附件
发表于 2013-10-24 12:21:25 | 显示全部楼层
回复 28# inflikt


    终于知道是什么问题了,b.txt 2009的下面一行才一个数字...重新修改了一下,应该可以了.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d /b /s *.txt') do (
  3.     set "n="
  4.     for /f "usebackq tokens=1,* delims= " %%i in ("%%a") do (
  5.         if defined flag (
  6.         for %%A in (!str!) do (set/a n+=1,s=n-1 & set str_!n!=%%A)
  7.         if /i "%%i"=="avge" (set "flag=" & call echo "%%~nxa" --- %%str_!s!%%)
  8.     )
  9.     set str=%%i %%j
  10.     if /i "!str: =!"=="D11Finalseasonallyadjusteddata" set flag=1
  11.     )
  12. )
  13. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
非常感谢 + 1 乐于助人

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-20 00:27 , Processed in 0.022113 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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