Text 从文本文件中获取不同的值
我正在处理非常大的修复消息日志文件。每条消息表示一组由SOH字符分隔的标记 与MQ消息不同,单个修复标记(和整个消息)不具有固定的长度或位置。日志可能包括不同类型的消息(具有不同数量和顺序的标记) 示例(多种消息类型之一): 因此,唯一确定的事情如下:(1)带等号的标签号唯一标识标签,(2)标签由SOH字符分隔 对于特定的标记(一次只需几个标记,而不是全部标记),我需要获得它们的不同值的列表-类似于以下内容: 49=ABC 49=DEF 49=GHI 输出的格式实际上并不重要 如有任何建议,我将不胜感激 亲切问候,,Text 从文本文件中获取不同的值,text,batch-file,Text,Batch File,我正在处理非常大的修复消息日志文件。每条消息表示一组由SOH字符分隔的标记 与MQ消息不同,单个修复标记(和整个消息)不具有固定的长度或位置。日志可能包括不同类型的消息(具有不同数量和顺序的标记) 示例(多种消息类型之一): 因此,唯一确定的事情如下:(1)带等号的标签号唯一标识标签,(2)标签由SOH字符分隔 对于特定的标记(一次只需几个标记,而不是全部标记),我需要获得它们的不同值的列表-类似于以下内容: 49=ABC 49=DEF 49=GHI 输出的格式实际上并不重要 如有任何建议,我将
Victor O.尝试此批处理文件。将日志文件名添加为参数。e、 g:
LISTTAG.BAT SOH.LOG
它将显示所有标签id及其唯一值。e、 g:
9=387
12=abc
34=asb73
9=123
12=xyz
名为tagNNlist.txt
(其中NN
是标记id号)的文件将用于查找唯一的标记id和值,但在批处理结束时作为报告保留不变
下面代码中显示的{SOH}
文本实际上是SOH字符(ASCII 0x01),因此在复制和粘贴代码后,应该将其更改为SOH字符。我必须替换那个角色,因为它被服务器剥离了。使用写字板通过键入0001
生成SOH字符,然后按ALT+X
。使用批处理文件代码将该字符复制并粘贴到记事本中
需要注意的一点是,代码只处理从第16列开始的行。示例行中的07:00:32-SEND:
将被忽略。我假设它们都是从固定长度的文本开始的
变化:
- 按标记ID将生成的标记列表文件更改为单独的文件。e、 g.:
,tag12list.txt
等tag52list.txt
- 已删除生成的标记列表文件中的标记id号。e、 g.:
变成12=abc
abc
LISTTAG.BAT
:
@echo off
setlocal enabledelayedexpansion
if "%~1" == "" (
echo No source file specified.
goto :eof
)
if not exist "%~1" (
echo Source file not found.
goto :eof
)
echo Warning! All "tagNNlist.txt" file in current
echo directory will be deleted and overwritten.
echo Note: The "NN" is tag id number 0-99. e.g.: "tag99list.txt"
pause
echo.
for /l %%a in (0,1,99) do if exist tag%%alist.txt del tag%%alist.txt
for /f "usebackq delims=" %%a in ("%~1") do (
rem *****below two lines strip the first 15 characters (up to "-SEND:")
set x=%%a
set x=!x:~15,99!
rem *****9 tags per line
for /f "tokens=1,2,3,4,5,6,7,8,9 delims={SOH}" %%b in ("!x!") do (
call :dotag "%%b" %*
call :dotag "%%c"
call :dotag "%%d"
call :dotag "%%e"
call :dotag "%%f"
call :dotag "%%g"
call :dotag "%%h"
call :dotag "%%i"
call :dotag "%%j"
)
)
echo.
echo Done.
goto :eof
rem dotag "{id=value}"
:dotag
for /f "tokens=1,2 delims==" %%p in (%1) do (
set z=0
if exist tag%%plist.txt (
call :chktag %%p "%%q"
) else (
rem>tag%%plist.txt
)
if !z! == 0 (
echo %%q>>tag%%plist.txt
echo %~1
)
)
goto :eof
rem chktag {id} "{value}"
:chktag
for /f "delims=" %%y in (tag%1%list.txt) do (
if /i "%%y" == %2 (
set z=1
goto :eof
)
)
goto :eof
尝试此批处理文件。将日志文件名添加为参数。e、 g:
LISTTAG.BAT SOH.LOG
它将显示所有标签id及其唯一值。e、 g:
9=387
12=abc
34=asb73
9=123
12=xyz
名为tagNNlist.txt
(其中NN
是标记id号)的文件将用于查找唯一的标记id和值,但在批处理结束时作为报告保留不变
下面代码中显示的{SOH}
文本实际上是SOH字符(ASCII 0x01),因此在复制和粘贴代码后,应该将其更改为SOH字符。我必须替换那个角色,因为它被服务器剥离了。使用写字板通过键入0001
生成SOH字符,然后按ALT+X
。使用批处理文件代码将该字符复制并粘贴到记事本中
需要注意的一点是,代码只处理从第16列开始的行。示例行中的07:00:32-SEND:
将被忽略。我假设它们都是从固定长度的文本开始的
变化:
- 按标记ID将生成的标记列表文件更改为单独的文件。e、 g.:
,tag12list.txt
等tag52list.txt
- 已删除生成的标记列表文件中的标记id号。e、 g.:
变成12=abc
abc
LISTTAG.BAT
:
@echo off
setlocal enabledelayedexpansion
if "%~1" == "" (
echo No source file specified.
goto :eof
)
if not exist "%~1" (
echo Source file not found.
goto :eof
)
echo Warning! All "tagNNlist.txt" file in current
echo directory will be deleted and overwritten.
echo Note: The "NN" is tag id number 0-99. e.g.: "tag99list.txt"
pause
echo.
for /l %%a in (0,1,99) do if exist tag%%alist.txt del tag%%alist.txt
for /f "usebackq delims=" %%a in ("%~1") do (
rem *****below two lines strip the first 15 characters (up to "-SEND:")
set x=%%a
set x=!x:~15,99!
rem *****9 tags per line
for /f "tokens=1,2,3,4,5,6,7,8,9 delims={SOH}" %%b in ("!x!") do (
call :dotag "%%b" %*
call :dotag "%%c"
call :dotag "%%d"
call :dotag "%%e"
call :dotag "%%f"
call :dotag "%%g"
call :dotag "%%h"
call :dotag "%%i"
call :dotag "%%j"
)
)
echo.
echo Done.
goto :eof
rem dotag "{id=value}"
:dotag
for /f "tokens=1,2 delims==" %%p in (%1) do (
set z=0
if exist tag%%plist.txt (
call :chktag %%p "%%q"
) else (
rem>tag%%plist.txt
)
if !z! == 0 (
echo %%q>>tag%%plist.txt
echo %~1
)
)
goto :eof
rem chktag {id} "{value}"
:chktag
for /f "delims=" %%y in (tag%1%list.txt) do (
if /i "%%y" == %2 (
set z=1
goto :eof
)
)
goto :eof
选项1 下面的批处理脚本具有良好的性能。它有以下限制
- 检查重复项时忽略大小写
- 它可能无法正确保留值中包含
的所有值=
=
。我通过在变量名中添加一个额外的SOH字符来减少该限制,并更改了用于解析该值的delims。现在,只要在=
之前区分唯一值,值就可以包含=
。如果值在=
之后区分,则仅保留一个值
确保在顶部附近修正SOH变量的定义
日志文件的名称作为第一个参数传递,请求的标记列表作为第二个参数传递(用引号括起来)
选项1 下面的批处理脚本具有良好的性能。它有以下限制
- 检查重复项时忽略大小写
- 它可能无法正确保留值中包含
的所有值=
=
。我通过在变量名中添加一个额外的SOH字符来减少该限制,并更改了用于解析该值的delims。现在,只要在=
之前区分唯一值,值就可以包含=
。如果值在=
之后区分,则仅保留一个值
确保在顶部附近修正SOH变量的定义
日志文件的名称作为第一个参数传递,请求的标记列表作为第二个参数传递(用引号括起来)
你能再举一个例子,用文本替换SOH字符吗?e、 g.:将每个替换为
{SOH}
。注意:不要把它们放在这里。改为编辑你的帖子。杰,谢谢你的建议。我在标签之间添加了(SOH)以模拟分隔符。我可以假设您想使用窗口命令提示符下的批处理文件吗?Jay,是的-我更喜欢批处理文件。Jay,非常感谢,太好了!我会试试a.s.a.p.并让你知道。你能再举一个用文本替换SOH字符的例子吗?e、 g.:将每个替换为{SOH}
。注意:不要把它们放在这里。改为编辑你的帖子。杰,谢谢