使用Windows批处理脚本从文本文件中删除前几行

时间:2019-07-18 23:57:18

标签: windows batch-file findstr

最好是单线的,我该如何及时地(最多几秒钟)从大型(3MB +)文本文件中删除开头的行范围。我见过使用for /ffindstr的解决方案,但是for循环使它非常慢,并且工具more无法处理较大的文件而不会挂起。

@echo off &setlocal
set "testing.txt=%~1"
(for /f "delims=" %%i in ('findstr /n "^" "testing.txt"') do (
    set "line=%%i"
    for /f "delims=:" %%a in ("%%i") do set "row=%%a"
    setlocal enabledelayedexpansion
    set "line=!line:*:=!"
    if !row! gtr 100 echo(!line!
    endlocal
))>output.txt

这里是尝试。这是非常慢的。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

据我所知,您想跳过巨大的文本文件的前100行,并想返回其余的行。

好吧,当我查看您的代码时,我首先看到的是您嵌套了两个for /F循环,这可能会使事情变慢。

内部循环只是将前面的行号分割开,并用冒号与其他行分隔。

为此,您可以(mis-)使用set /A,当您使用其隐式变量扩展时,它可以将字符串转换为数值(因此,没有%或{{1 }});当遇到第一个非数字字符(在我们的情况下为!)时,此过程停止。因此,只需将内部:循环替换为:

for /F

这肯定会加快速度。但是,请注意,这会将输入文本文件限制为2 ^ 31-1行。请注意,每行的字符/字节数仍限制为8190。

顺便说一句,您不必单独执行set /A "row=line" ,只需删除此步骤并将set "line=!line:*:=!"替换为echo(!line!


如果您不需要保留空行,那么整个方法就是这样简单:

echo(!line:*:=!

这不限制文件大小,但行长不得超过8191个字符/字节。

答案 1 :(得分:0)

这是消除大文件中前几行的最快方法。按照您的要求以单线形式编写:

@echo off
< testing.txt ( (for /L %%i in (1,1,100) do set /P "=") & findstr "^" ) > output.txt

但是,请注意,此方法最多只能管理长达1023个字符的行,因为它使用set /P命令来读取和丢弃不需要的行...

有关此方法的说明,请参见this answer