使用 Windows 批处理脚本从文本文件中删除前几行
Delete first few lines from a text file with Windows batch scripting
最好是单行,我如何及时(最多几秒)从大型 (3MB+) 文本文件中删除开头的一系列行。我已经看到使用 for /f
和 findstr
的解决方案,但是 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。
最好是单行,我如何及时(最多几秒)从大型 (3MB+) 文本文件中删除开头的一系列行。我已经看到使用 for /f
和 findstr
的解决方案,但是 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。