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

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

现在有若干个txt文件,里面的格式基本一致,如其中一个txt的内容
.....
D 11  Final seasonally adjusted data
  From  2003.Jan to 2009.Dec
  Observations         84
-----------------------------------------------------------------------------
               Jan      Feb      Mar      Apr      May      Jun
               Jul      Aug      Sep      Oct      Nov      Dec        TOTAL  
-----------------------------------------------------------------------------
  2003      5436.48  5442.45  5459.32  5455.02  5457.04  5455.18
            5467.18  5475.61  5466.99  5434.10  5453.44  5460.38      65463.21

  2004      5448.64  5445.03  5452.04  5442.37  5441.17  5451.61
            5465.41  5473.73  5477.79  5451.15  5458.08  5457.64      65464.66

  2005      5540.25  5564.78  5556.51  5294.60  5321.58  5309.99
            5338.84  5411.57  5384.81  5471.84  5386.25  5392.34      64973.36

  2006      5279.67  5323.10  5288.35  5431.96  5516.74  5551.05
            5468.80  5461.49  5581.07  5529.45  5512.74  5438.14      65382.56

  2007      5577.12  5421.42  5367.01  5484.88  5606.76  5591.13
            5558.89  5551.72  5491.54  5380.13  5523.39  5488.72      66042.72

  2008      5365.49  5451.04  5592.67  5544.06  5368.22  5341.43
            5066.20  4995.55  5008.65  4517.47  3864.44  4075.86      60191.09

  2009      4595.22  5012.21  4990.79  4972.96  5347.19  5460.18
            5553.93  5559.29  5323.20  5578.44  5504.65  5613.92      63511.98

AVGE      5320.41  5380.01  5386.67  5375.12  5436.96  5451.51
            5417.04  5418.42  5390.58  5337.51  5243.29  5275.29
......
截取是一部分内容,现在希望得到5613.92这个数字,是D 11 Final seasonally adjusted data下面的第一个AVGE(绿色标注),然后之前的第二个数字5613.92,写到另一个txt中
恳求帮助!
1

评分人数

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

请把其中一个txt压缩之后传上来看看

TOP

回复 2# DAIC

附件已添加

TOP

本帖最后由 foxJL 于 2013-10-22 17:10 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,6 delims= " %%i in (a.txt) do (
  3. set/a n+=1,s=n-1
  4. set str!n!=%%j
  5. if /i %%i equ avge call echo %%str!s!%%
  6. )
  7. pause
复制代码

TOP

回复 4# foxJL
多谢foxJL大大,不过测试下来有很多多余的数据

TOP

回复 5# inflikt


    一个文本里是不是有很多个AVGE?
我直接用你上面发出来的文本测试的,没有问题.

TOP

回复 6# foxJL

是的,有很多AVGE,我后面上传附件了,我只是需要D 11 Final seasonally adjusted data之后AVGE之前的那个数据

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (a.txt) do (
  3.     if defined flag (
  4.         for /f "tokens=1,6" %%b in ("%%a") do (
  5.             if /i "%%b"=="AVGE" set "flag=" & echo,!Num!
  6.             set "Num=%%c"
  7.         )
  8.     )
  9.     if /i "%%a"=="D 11  Final seasonally adjusted data" set flag=1
  10. )
  11. pause
复制代码

TOP

回复 8# apang
apang大大,我测试了下,得出的结果是5347.19,是2009之后是第五个数,不是需要的那个数。

TOP

回复 9# inflikt


    我用附件测试没有问题,5613.92

TOP

回复  inflikt


    我用附件测试没有问题,5613.92
apang 发表于 2013-10-22 21:59



    嗯,谢谢apang大大,我用附件测试了下也没有问题,不过还有很多txt文件是D11 Final seasonally adjusted data,D跟11之间没有空格,所以导致错误。。
所以大大能给完善下,D11或者是D 11就不要判断了。而且有很多txt文件要同样的方法去查找,能不能做一个查找本目录下所有txt文件中的指定数字,然后导出到一个保存结果的txt文件中呢。

TOP

根据apang的思路来一个支持多TXT文本的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d /b /s *.txt') do (
  3. for /f "tokens=1,5,6 delims= " %%i in (%%a) do (
  4. if defined flag (
  5. if /i %%i equ avge set "flag=" & echo "%%~nxa" --- !str!
  6. set str=%%k
  7. )
  8. if /i "%%j %%k"=="adjusted data" set flag=1
  9. )
  10. )
  11. pause
复制代码

TOP

回复 12# foxJL
foxJL 大大,我测试过了,有2个问题,一个是部分文件写的是D 11 Final seasonally adjusted data,部分文件是D11 Final seasonally adjusted data(是因为这些txt文件都是另一个软件的导出结果,所以存在差异),您的代码"tokens=1,5,6只能是解决D 11 Final seasonally adjusted data,能不能把两种情况都考虑进去。
还有一个问题是,数据不对,AVGE前面的是2009年的13个数据,12个是对应月份,另一个是平均值,但是不一定有13个数据,有可能月份不足,现在需要的是AVGE前面倒数第二个数,实际就是2009年的最后一个数。您的代码执行结果是5347.19,是第五个月的数据不符合需求。
求大大指点。。
另我上传了另一个txt文件,望大大测试可行性。

TOP

本帖最后由 apang 于 2013-10-23 09:16 编辑

这样试试呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. (for %%i in (*.txt) do (
  3.     set "Num=" & set "flag="
  4.     for /f "usebackq tokens=1*" %%a in ("%%i") do (
  5.         set "str=%%a %%b"
  6.         if defined flag (
  7.             if /i "%%a"=="AVGE" set "flag=" & echo,!Num!
  8.             for %%c in (!str!) do set "Num=!a!" & set "a=%%c"
  9.         )
  10.         if /i "!str: =!"=="D11Finalseasonallyadjusteddata" set flag=1
  11.     )
  12. ))>$
  13. move $ Result.txt
  14. pause
复制代码
1

评分人数

    • foxJL: 乐于助人技术 + 1

TOP

回复 14# apang
apang大大辛苦了,不过我测试下来还是数据错误(还是5347.19),是不是因为要的数跟AVGE不在同一行的缘故。抱歉新手了,看代码吃力

TOP

返回列表