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

Delete first few lines from a text file with Windows batch scripting

最好是单行,我如何及时(最多几秒)从大型 (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

这是一次尝试。它非常慢。如有任何建议,我们将不胜感激。

据我所知,您想跳过庞大的文本文件的前 100 行,而想 return 剩下的。

嗯,当我查看您的代码时,我首先看到的是您嵌套了两个 for /F 循环,这可能会减慢速度。

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

为此,您可以(误)使用 set /A,当您使用它的隐式变量扩展(因此没有 %!);当遇到第一个 non-numeric 字符时,这个过程停止,在我们的情况下是 :。所以只需将内部 for /F 循环替换为:

set /A "row=line"

这肯定会加快速度。但是,请注意这会将输入文本文件限制为 2^31 - 1 行。请注意,每行 characters/bytes 的数量仍然限制在 8190 左右。

顺便说一下,您不必单独执行 set "line=!line:*:=!",只需删除它并将 echo(!line! 替换为 echo(!line:*:=!


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

@echo off
for /F usebackq^ skip^=100^ delims^=^ eol^= %%i in ("testing.txt") do echo(%%i

这不限制文件大小,但行长度不得超过 8191 characters/bytes。

这是消除大文件中前几行的最快方法。写成one-liner,如你所求:

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

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

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