我试图在文本文件中搜索关键字,然后在特定的行/关键字(不是文件末尾)之后插入多行。
我的代码可以找到关键字,但是我很难添加这些行。我的代码将行添加到文件的末尾,因此我需要帮助的地方是: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
)
答案 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=
无法在下一行匹配。
如果找到gfu
和LastUpdate=
并且行索引为
大于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
的写入句柄在整个循环中保持打开状态,因此缓存了写入。