Text 从文本文件中获取不同的值

Text 从文本文件中获取不同的值,text,batch-file,Text,Batch File,我正在处理非常大的修复消息日志文件。每条消息表示一组由SOH字符分隔的标记 与MQ消息不同,单个修复标记(和整个消息)不具有固定的长度或位置。日志可能包括不同类型的消息(具有不同数量和顺序的标记) 示例(多种消息类型之一): 因此,唯一确定的事情如下:(1)带等号的标签号唯一标识标签,(2)标签由SOH字符分隔 对于特定的标记(一次只需几个标记,而不是全部标记),我需要获得它们的不同值的列表-类似于以下内容: 49=ABC 49=DEF 49=GHI 输出的格式实际上并不重要 如有任何建议,我将

我正在处理非常大的修复消息日志文件。每条消息表示一组由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}
。注意:不要把它们放在这里。改为编辑你的帖子。杰,谢谢