我希望能够遍历文本文件的各个部分并提取&在每个部分中连接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
我完全不知道从哪里开始,我的技术水平非常低 - 我能够找到批处理文件的方式,并且可以调整以适应,但不能从头开始编写。 提前感谢任何看过这个的人。
答案 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,例如第一次1476
和6
第二次,但第一次要在令牌后插入短划线,第二次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!"
)
此方法比在每次迭代中执行更多操作的其他方法运行得更快。如果要处理的文件很大,处理时间的差异可能很大。