遍历文本文件并在批处理文件中插入一行

时间:2018-08-18 10:51:12

标签: batch-file text

我试图在文本文件中搜索关键字,然后在特定的行/关键字(不是文件末尾)之后插入多行。

我的代码可以找到关键字,但是我很难添加这些行。我的代码将行添加到文件的末尾,因此我需要帮助的地方是:ADD THE TEXT之后。

myfile.text看起来像:

QFU;
text2;
LastUpdate=20180323;
text3;

我想在LastUpdate之后添加一个静态行列表,这会使文件看起来像这样:

QFU;
text2;
LastUpdate=20180323;
Inserted text1
Inserted text2
text3;

这是我的代码:

@echo

SET /A COND1=0

for /F "tokens=*" %%i in (myfile.txt) do call :process %%i
goto thenextstep
:process
set VAR1=%1
IF "%VAR1%"=="QFU" SET /A COND1=1
IF "%VAR1%"=="QFU" (
msg * "QFU line found !!"
)
:If QFU line is found then look for Last update
IF "%COND1%"=="1" IF "%VAR1%"=="LastUpdate" (
msg * "LastUpdate line found !!"

:ADD THE TEXT
echo. text to be added>>myfile.txt

:reset COND1 to 0
set /A COND1=0
)

1 个答案:

答案 0 :(得分:1)

@echo off
setlocal enabledelayedexpansion

call :get_insert_index

if not defined index (
    >&2 echo index not defined.
    exit /b 1
)

set "i=0"

(
    for /f "tokens=*" %%A in (myfile.txt) do (
        set /a "i+=1"
        echo %%A

        for %%B in (%index%) do if !i! equ %%B (
            echo --- INSERT
        )
    )
) > myupdate.txt

exit /b

:get_insert_index
setlocal enabledelayedexpansion

set "i=0"
set "qfu="
set "total="

for /f "tokens=*" %%A in (myfile.txt) do (
    set /a i+=1
    set "line=%%~A"

    if "%%~A" == "QFU;" (
        set /a "qfu=!i! + 1"
    ) else if "!line:~,11!" == "LastUpdate=" (
        if defined qfu (
            if !i! gtr !qfu! (
                if defined total (set total=!total! !i!) else set total=!i!
                set "qfu="
            )
        )
    )
)
endlocal & set "index=%total%"
exit /b

这将在第一行之后插入以LastUpdate=开头的文本, 在QFU;行之后,但不在以LastUpdate=开头的行之后 这是QFU;之后的下一行。

标签:get_insert_index被调用并使用for循环 读取myfile.txt以获取LastUpdate=的行索引 上段提到的。 变量qfu存储着QFU;的行索引+ 1 LastUpdate=无法在下一行匹配。 如果找到gfuLastUpdate=并且行索引为 大于gfu,则将行索引附加到total。 未定义qfu以避免进一步匹配LastUpdate= 直到QFU;再次匹配。 循环将结束,并且全局变量index被设置为 值total。标签将控制权返回给调用者。

如果

index在脚本的顶部定义,则检查 标签的调用。 顶部的for循环读取myfile.txt,并回显读取的每一行。 嵌套的for循环检查index变量以匹配 当前行索引,如果相等,将echo新文本。 回声将重定向到myupdate.txt

使用了"!line:~,11!"的替换,因此请查看set /?以获得帮助。

使用了enabledelayedexpansion,因此请查看setlocal /?以获得帮助。 使用!的文本可能会发现!被解释为变量 因此请避免使用!

使用了gtr,可以在if /?中查看。 gtr是 “大于”。


避免创建索引的替代方法:

@echo off
setlocal enabledelayedexpansion

set "i=0"
set "gfu="

for /f "tokens=*" %%A in (myfile.txt) do (
    set /a i+=1
    set "line=%%~A"

    >> myupdate.txt echo(%%A

    if "%%~A" == "QFU;" (
        set /a "qfu=!i! + 1"
    ) else if "!line:~,11!" == "LastUpdate=" (
        if defined qfu (
            if !i! gtr !qfu! (
                >> myupdate.txt echo --- INSERT
                set "qfu="
            )
        )
    )
)

exit /b
  • >> myupdate.txt echo(%%A写入每一行。
  • >> myupdate.txt echo --- INSERT写入要插入的新行。

如果系统内存允许基于文件大小,则速度会更快:

@echo off
setlocal enabledelayedexpansion

set "i=0"
set "gfu="

(
    for /f "tokens=*" %%A in (myfile.txt) do (
        set /a i+=1
        set "line=%%~A"

        echo(%%A

        if "%%~A" == "QFU;" (
            set /a "qfu=!i! + 1"
        ) else if "!line:~,11!" == "LastUpdate=" (
            if defined qfu (
                if !i! gtr !qfu! (
                    echo --- INSERT
                    set "qfu="
                )
            )
        )
    )
) > myupdate.txt

exit /b

在2.74 MB的文件上使用,时间从70秒减少到21秒。 myupdate.txt的写入句柄在整个循环中保持打开状态,因此缓存了写入。