标题: [文本处理] 批处理如何从日志中提取变量数值到另外一个TXT中,并且重复更新? [打印本页]
作者: 13917134 时间: 2017-3-9 12:38 标题: 批处理如何从日志中提取变量数值到另外一个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一样自动更新与新建.
以下是我做的批处理第一部分。获取数字部分。然而不成功。好伤心。求大神解毒- set part=ms
- @findstr /c:%part% C:\Users\sz6vjc\Desktop\txt\1.txt > 2.txt
- for /f "delims=" %%1 in (2.txt)do (
- set str=%%1
- call set str=%%str:*in =%%
- call echo %%str%%
- )>>3.txt
复制代码
3.txt输入的还是带有字符.变成这样:- 515ms."
- 484ms."
- 546ms."
- 530ms."
复制代码
我已经翻了快200页的论坛。找到相关的。但是还是搞不定这个字符问题。并且这个更新的第二个步骤的代码。
求助大神帮忙解惑。
补充:红色部分的数值是变动的。有可能会有4位,5位数字。或者更多。数字后面的ms."都是固定的
作者: WHY 时间: 2017-3-9 13:22
call echo %%str:~0,-4%%
作者: 13917134 时间: 2017-3-9 13:39
回复 2# WHY
多谢解答。运行以后的确可以了。。能不能不另外建一个txt检索。直接一步操作完成呢?我的代码步骤太繁琐了。效率很低
作者: GNU 时间: 2017-3-9 15:44
- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('findstr "[0-9]ms" 1.txt') do (
- set "str=%%i"
- set "str=!str:* in =!"
- set "str=!str:~0,-4!"
- echo,!str!
- ))>2.txt
复制代码
作者: 13917134 时间: 2017-3-16 09:19
本帖最后由 13917134 于 2017-3-16 09:27 编辑
回复 4# GNU
谢谢大神解毒。代码完全可行。目前卡在文件夹历变部分。。我应该如何枚举整个文件夹下的txt文件。并提取好相应的值输出到对应新建另外一个目录下,建立对应文件夹呢?
还有一个重要的问题。。就是每次枚举怎么知道已经处理过的txt文件不会在处理。。如何对比。。
作者: GNU 时间: 2017-3-16 09:38
回复 5# 13917134
先解决枚举- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%a in ('dir /b /s /a-d *.txt') do (
- for /f "delims=" %%i in ('findstr "[0-9]ms" "%%a"') do (
- set "str=%%i"
- set "str=!str:* in =!"
- set "str=!str:~0,-4!"
- echo,!str!
- )
- ))>"C:\另一个目录\2.txt"
复制代码
作者: 13917134 时间: 2017-3-16 10:10
本帖最后由 13917134 于 2017-3-16 10:11 编辑
回复 6# GNU
文件路径是这样的
X:\Logs\Traceability Version 2\2017\01 - 一月\Final OP10-1\*.txt
我把文件放在logs文件夹里运行。- C:\Users\sz6vjc\Desktop\txt\Logs>锘縮etlocal enabledelayedexpansion
- '锘縮etlocal' is not recognized as an internal or external command,
- operable program or batch file.
-
- C:\Users\sz6vjc\Desktop\txt\Logs>(for /F "delims=" %a in ('dir /b /s /a-d *.txt'
- ) do (for /F "delims=" %i in ('findstr "[0-9]ms" "%a"') do (
- set "str=%i"
- set "str=!str:* in =!"
- set "str=!str:~0,-4!"
- echo,!str!
- ) ) ) 1>"C:\Users\sz6vjc\Desktop\txt\Logs\2.txt"
-
- C:\Users\sz6vjc\Desktop\txt\Logs>pause
- Press any key to continue . . .
复制代码
2.txt里面不是数字。是以下部分- 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 (
- set "str=%i"
- set "str=!str:* in =!"
- set "str=!str:~0,-4!"
- echo,!str!
- ) )
复制代码
好像没有成功
作者: GNU 时间: 2017-3-17 11:10
回复 7# 13917134
先解决这个报错:
'锘縮etlocal' is not recognized as an internal or external command
用记事本打开bat
文件
另存为
在下拉列表中选择 ANSI 编码
作者: 13917134 时间: 2017-3-17 14:01
回复 8# GNU
改了你说的代码。OK了。但是文件都是读取到同一个文件里面。可以分开读取到各自对应提取的txt文件名来在新目录存放吗
作者: GNU 时间: 2017-3-17 14:23
回复 9# 13917134 - @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /s /a-d *.txt') do (
- (for /f "delims=" %%i in ('findstr "[0-9]ms" "%%a"') do (
- set "str=%%i"
- set "str=!str:* in =!"
- set "str=!str:~0,-4!"
- echo,!str!
- ))>"C:\Users\%username%\Desktop\txt\Logs\%%~nxa"
- )
复制代码
作者: 13917134 时间: 2017-3-20 13:50
本帖最后由 13917134 于 2017-3-20 13:53 编辑
回复 10# GNU
可以了。厉害.
如果是更新对比是不是通过引用robocopy来解决?是不是用过设定拷贝的时间。然后在进行处理不同时间的txt文件定时更新?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |