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

[文本处理] 批处理如何从日志中提取变量数值到另外一个TXT中,并且重复更新?

求各位大神帮我看一下应该怎么写?
需求:需要把文件夹与子文件夹中的txt文件都历变,并且提取过的文件不会在提取。只会提取新txt文件
环境:
根文件夹[A] 或者[B]
根文件夹下的子文件夹 [XXX]
[XXX]下子文件夹[XXX1]
[XXX1]文件夹下 才有文件
例如目录 C:\Logs\Traceability Version 2\2017\01 - 一月\Final OP10-1\
log文件存放按年份,月份,设备名称存放,里面的文件名是按日期自动新建 ,例如 2017-01-26 - Final OP10-1 Log.txt
文件部分内容:
  2017-02-08 00:00:19.295,[AM OP60],[SD570160X01],[INFO],"Request complete in 484ms."
2017-02-08 00:00:22.915,[AM OP60],[SD570160X01],[INFO],"Function 1 request received."
2017-02-08 00:00:22.993,[AM OP60],[SD570160X01],[INFO],"Data read from PLC: (PLCID='SD570160X') (StationID='SD570160X01') (Function='1') (Serial='21703827024') (Status='') (Model='Brush') (StationName='OP60 Worm Zoning') (StationLookupID='SD570157X01')"
2017-02-08 00:00:22.993,[AM OP60],[SD570160X01],[INFO],"Looking for data for serial number: 21703827024"
2017-02-08 00:00:23.320,[AM OP60],[SD570160X01],[INFO],"Sending data to PLC: (ElapsedTime='000:00:05:58') (StationResultID='SD570157X01') (Status='9999') (Model='Brush') (StationName='OP40A_RUNIN')"
2017-02-08 00:00:23.445,[AM OP60],[SD570160X01],[INFO],"Request complete in 546ms."
2017-02-08 00:00:40.979,[AM OP60],[SD570160X01],[INFO],"Function 10 request received."
以上文件我只取红色部分作为一个TXT存放。并随LOG一样自动更新与新建.
以下是我做的批处理第一部分。获取数字部分。然而不成功。好伤心。求大神解毒
  1. set part=ms
  2. @findstr /c:%part% C:\Users\sz6vjc\Desktop\txt\1.txt > 2.txt
  3. for /f "delims=" %%1 in (2.txt)do (
  4. set str=%%1
  5. call set str=%%str:*in =%%
  6. call echo %%str%%
  7. )>>3.txt
复制代码
3.txt输入的还是带有字符.变成这样:
  1. 515ms."
  2. 484ms."
  3. 546ms."
  4. 530ms."
复制代码
我已经翻了快200页的论坛。找到相关的。但是还是搞不定这个字符问题。并且这个更新的第二个步骤的代码。
求助大神帮忙解惑。

补充:红色部分的数值是变动的。有可能会有4位,5位数字。或者更多。数字后面的ms."都是固定的

call echo %%str:~0,-4%%

TOP

回复 2# WHY

多谢解答。运行以后的确可以了。。能不能不另外建一个txt检索。直接一步操作完成呢?我的代码步骤太繁琐了。效率很低

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('findstr "[0-9]ms" 1.txt') do (
  4.     set "str=%%i"
  5.     set "str=!str:* in =!"
  6.     set "str=!str:~0,-4!"
  7.     echo,!str!
  8. ))>2.txt
复制代码

TOP

本帖最后由 13917134 于 2017-3-16 09:27 编辑

回复 4# GNU


    谢谢大神解毒。代码完全可行。目前卡在文件夹历变部分。。我应该如何枚举整个文件夹下的txt文件。并提取好相应的值输出到对应新建另外一个目录下,建立对应文件夹呢?

还有一个重要的问题。。就是每次枚举怎么知道已经处理过的txt文件不会在处理。。如何对比。。

TOP

回复 5# 13917134


先解决枚举
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in ('dir /b /s /a-d *.txt') do (
  4.     for /f "delims=" %%i in ('findstr "[0-9]ms" "%%a"') do (
  5.         set "str=%%i"
  6.         set "str=!str:* in =!"
  7.         set "str=!str:~0,-4!"
  8.         echo,!str!
  9.     )
  10. ))>"C:\另一个目录\2.txt"
复制代码

TOP

本帖最后由 13917134 于 2017-3-16 10:11 编辑

回复 6# GNU


    文件路径是这样的
X:\Logs\Traceability Version 2\2017\01 - 一月\Final OP10-1\*.txt

我把文件放在logs文件夹里运行。
  1. C:\Users\sz6vjc\Desktop\txt\Logs>锘縮etlocal enabledelayedexpansion
  2. '锘縮etlocal' is not recognized as an internal or external command,
  3. operable program or batch file.
  4. C:\Users\sz6vjc\Desktop\txt\Logs>(for /F "delims=" %a in ('dir /b /s /a-d *.txt'
  5. ) do (for /F "delims=" %i in ('findstr "[0-9]ms" "%a"') do (
  6. set "str=%i"
  7. set "str=!str:* in =!"
  8. set "str=!str:~0,-4!"
  9. echo,!str!
  10. ) ) ) 1>"C:\Users\sz6vjc\Desktop\txt\Logs\2.txt"
  11. C:\Users\sz6vjc\Desktop\txt\Logs>pause
  12. Press any key to continue . . .
复制代码
2.txt里面不是数字。是以下部分
  1. C:\Users\sz6vjc\Desktop\txt\Logs>(for /F "delims=" %i in ('findstr "[0-9]ms" "C:\Users\sz6vjc\Desktop\txt\Logs\Traceability Version 2\2017\01 - 一月\Final OP10-1\2017-01-21 - Final OP10-1 Log.txt"') do (
  2. set "str=%i"  
  3. set "str=!str:* in =!"  
  4. set "str=!str:~0,-4!"  
  5. echo,!str!
  6. ) )
复制代码
好像没有成功

TOP

回复 7# 13917134


先解决这个报错:
'锘縮etlocal' is not recognized as an internal or external command

用记事本打开bat
文件
另存为
在下拉列表中选择 ANSI 编码

TOP

回复 8# GNU


    改了你说的代码。OK了。但是文件都是读取到同一个文件里面。可以分开读取到各自对应提取的txt文件名来在新目录存放吗

TOP

回复 9# 13917134
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /s /a-d *.txt') do (
  4.     (for /f "delims=" %%i in ('findstr "[0-9]ms" "%%a"') do (
  5.         set "str=%%i"
  6.         set "str=!str:* in =!"
  7.         set "str=!str:~0,-4!"
  8.         echo,!str!
  9.     ))>"C:\Users\%username%\Desktop\txt\Logs\%%~nxa"
  10. )
复制代码
1

评分人数

TOP

本帖最后由 13917134 于 2017-3-20 13:53 编辑

回复 10# GNU


    可以了。厉害.
如果是更新对比是不是通过引用robocopy来解决?是不是用过设定拷贝的时间。然后在进行处理不同时间的txt文件定时更新?

TOP

返回列表