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

apang大大,改动后测试成功,能得出正确结果,现正在学习代码中,谢谢!

TOP

19楼更新了一下,应该可以了吧

TOP

回复 16# inflikt


    14#改一下,试试看

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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,请点击我签名里的链接下载。

TOP

蛋疼,试试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
复制代码

TOP

回复 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

TOP

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

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

回复 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的思路来一个支持多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

回复  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

回复 9# inflikt


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

TOP

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

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

返回列表