批处理文件文本字符串提取和加入

时间:2015-12-15 13:01:56

标签: batch-file

我希望能够遍历文本文件的各个部分并提取&在每个部分中连接2行的部分。 文本文件内容的一个小例子:

文字文件内容

Fmt ID_FMT_JE_EVT ( 3 ; 18 ) struct
{
    Fmt ID_FMT_JE_DATE ( 3 ; 12 ) date 11/12/2015 20:13:24
    Fmt ID_FMT_JE_NUMALM ( 3 ; 14 ) uint 1476
    Fmt ID_FMT_JE_INDEX ( 3 ; 15 ) uint 6
    Fmt ID_FMT_JE_ETAT ( 3 ; 16 ) uint 1
    Fmt ID_FMT_JE_PARAM ( 3 ; 17 ) string ""
}
Fmt ID_FMT_JE_EVT ( 3 ; 18 ) struct 
{
    Fmt ID_FMT_JE_DATE ( 3 ; 12 ) date 11/12/2015 20:16:15
    Fmt ID_FMT_JE_NUMALM ( 3 ; 14 ) uint 1801
    Fmt ID_FMT_JE_INDEX ( 3 ; 15 ) uint 5
    Fmt ID_FMT_JE_ETAT ( 3 ; 16 ) uint 1
    Fmt ID_FMT_JE_PARAM ( 3 ; 17 ) string ""
}
Fmt ID_FMT_JE_EVT ( 3 ; 18 ) struct 
{
    Fmt ID_FMT_JE_DATE ( 3 ; 12 ) date 11/12/2015 20:13:45
    Fmt ID_FMT_JE_NUMALM ( 3 ; 14 ) uint 1461
    Fmt ID_FMT_JE_INDEX ( 3 ; 15 ) uint 99
    Fmt ID_FMT_JE_ETAT ( 3 ; 16 ) uint 1
    Fmt ID_FMT_JE_PARAM ( 3 ; 17 ) string ""
}

我之后能够查看每个部分,找到命名的行 ID_FMT_JE_NUMALM & ID_FMT_JE_INDEX ,将与其关联的值(如果可能用连字符分隔)合并为一个变量,并将其显示为列表。

例如,在上面的文本文件示例的第一部分中,我试图提取以下内容。

Fmt ID_FMT_JE_NUMALM ( 3 ; 14 ) uint 1476
Fmt ID_FMT_JE_INDEX ( 3 ; 15 ) uint 6

..抓住每一行的值..

1476
6

..将它们连接成一个变量(最好用连字符分隔)..

1476-6

..然后转到下一部分并重复该过程直到文件结束。 然后我想将结果显示为列表:

期望的结果

1476-6
1801-5
1461-99

我完全不知道从哪里开始,我的技术水平非常低 - 我能够找到批处理文件的方式,并且可以调整以适应,但不能从头开始编写。 提前感谢任何看过这个的人。

2 个答案:

答案 0 :(得分:0)

试一试。将soinput.txt更改为您的文本文件名。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "ID_FMT_JE_NUMALM="
set "ID_FMT_JE_INDEX="
FOR /F "TOKENS=1-9 delims= " %%G IN ('type soinput.txt ^|findstr "ID_FMT_JE_NUMALM ID_FMT_JE_INDEX"') DO (
    SET %%H=%%O
    IF DEFINED ID_FMT_JE_NUMALM (
        IF DEFINED ID_FMT_JE_INDEX (
            ECHO !ID_FMT_JE_NUMALM!-!ID_FMT_JE_INDEX!
            set "ID_FMT_JE_NUMALM="
            set "ID_FMT_JE_INDEX="
        )
    )
)
pause

输出

1476-6
1801-5
1461-99
Press any key to continue . . .

答案 1 :(得分:0)

下面的批处理文件使用高级技巧。在您的结果中,您需要搜索行的标记号9,例如第一次14766第二次,但第一次要在令牌后插入短划线,第二次CR + LF(线路终结器)。这样,我们可以定义两个“令牌结束”字符串,并且每次显示令牌9时只交换它们。每个令牌EOT对都通过set /P "=..." < NUL命令显示,因为echo总是在末尾插入CR + LF。

@echo off
setlocal EnableDelayedExpansion

set "eot1=-"
rem Define "eot2" as CR+LF pair:
for /F %%a in ('copy /Z "%~F0" NUL') do set eot2=%%a^
%empty line 1/2, don't remove%
%empty line 2/2, don't remove%

for /F "tokens=9" %%a in ('findstr "ID_FMT_JE_NUMALM ID_FMT_JE_INDEX" input.txt') do (
   set /P "=%%a!eot1!" < NUL
   set "eot=!eot1!" & set "eot1=!eot2!" & set "eot2=!eot!"
)

此方法比在每次迭代中执行更多操作的其他方法运行得更快。如果要处理的文件很大,处理时间的差异可能很大。