【问题标题】:Batch File Text string extract and join批处理文件文本字符串提取和连接
【发布时间】:2015-12-16 01:22:13
【问题描述】:

我希望能够遍历文本文件的各个部分,并在每个部分中提取和连接 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_NUMALMID_FMT_JE_INDEX,将与它们关联的值(如果 poss 用连字符分隔)组合成一个变量,并将它们显示为列表。

例如,以上面文本文件的第一部分为例,我试图提取以下内容..

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

我完全不知道从哪里开始,我的技术水平相当低 - 我能够找到处理批处理文件的方法,并且可以调整以适应,但不能从头开始编写。 提前感谢任何查看此内容的人。

【问题讨论】:

  • 你能附上你到目前为止写的代码吗?
  • 我很乐意 - 我已经在 stackoverflow 上抓取了几个代码 elswhere 的示例来尝试执行此操作,但我没有足够的专业知识来“调整”它以使其完成我想要的是。所以不幸的是我没有..
  • 如果您可以包含您尝试过的任何代码以及它为什么不适合您的原因,这对于可能能够进一步帮助您的其他人来说真的很有帮助。
  • 这是我一直在摆弄的东西,不幸的是没有多大成功:stackoverflow.com/questions/8900374/…

标签: batch-file


【解决方案1】:

试试这个。将 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 . . .

【讨论】:

  • 完美!谢谢@Squashman!这非常有效。感谢您抽出宝贵时间查看此内容!
【解决方案2】:

下面的批处理文件使用了高级技巧。在您的结果中,您需要搜索行的标记号 9,例如 1476 第一次和 6 第二次,但第一次您想在标记后插入破折号,第二次要插入 CR+LF (行终止符)。这样,我们可以定义两个“End Of Token”字符串,并在每次显示令牌 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!"
)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多