我想知道如何循环通过文本文件中的每一行使用Windows批处理文件和处理每行文本相继。


当前回答

使用cmd.exe和

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

仅适用于“正常”文件。对于巨大的文件,它失败得很惨。

对于大文件,你可能需要使用Powershell和类似的东西:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

或者如果你有足够的内存:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

这对我来说是一个250 MB的文件,包含200多万行,其中for /F…命令行写了几千行就卡住了。

关于foreach和foreach - object的区别,请参见了解foreach和foreach - object。

(字幕:在PowerShell中逐行读取文件)

其他回答

从Windows命令行引用:

要解析一个文件,忽略注释行,输入:

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

这个命令解析Myfile.txt中的每一行,忽略以分号开头的行,并将每行的第二和第三个标记传递给FOR主体(标记由逗号或空格分隔)。FOR语句体引用%i来获取第二个令牌,引用%j来获取第三个令牌,引用%k来获取所有剩余的令牌。

如果您提供的文件名包含空格,则在文本周围使用引号(例如,“文件名”)。要使用引号,必须使用usebackq。否则,引号将被解释为定义要解析的字面值字符串。

顺便说一下,你可以在大多数Windows系统上找到命令行帮助文件:

 "C:\WINDOWS\Help\ntcmds.chm"

或者,你可以排除引号中的选项:

FOR /F %%i IN (myfile.txt) DO ECHO %%i

使用cmd.exe和

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

仅适用于“正常”文件。对于巨大的文件,它失败得很惨。

对于大文件,你可能需要使用Powershell和类似的东西:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

或者如果你有足够的内存:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

这对我来说是一个250 MB的文件,包含200多万行,其中for /F…命令行写了几千行就卡住了。

关于foreach和foreach - object的区别,请参见了解foreach和foreach - object。

(字幕:在PowerShell中逐行读取文件)

公认的答案是好的,但有两个局限性。 它删除空行和以;

要读取任何内容的行,您需要延迟展开切换技术。

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Findstr用于用行号和冒号作为每行的前缀,因此空行不再是空的。

delayeexpansion需要被禁用,当访问%%a参数时,否则是感叹号!插入符号^将丢失,因为它们在该模式中具有特殊含义。

但是要从行中删除行号,需要启用延迟扩展。 设置"var=!var:*:=!"删除第一个冒号之前的所有冒号(使用delims=:也会删除一行开头的所有冒号,而不仅仅是findstr中的冒号)。 endlocal对下一行再次禁用延迟扩展。

唯一的限制现在是线长限制~8191,但似乎没有办法克服这一点。

@ kraus先生的回答很有启发性。另外,如果您想加载与批处理文件位于同一目录中的文件,请在文件名前加上%~dp0。这里有一个例子:

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

注意:如果你的文件名或目录(例如上面例子中的myfile.txt)有一个空格(例如:'my file.txt'或'c:\程序文件'),使用:

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

,使用type关键字调用type程序,该程序显示文本文件的内容。如果您不想承受调用type命令的开销,您应该将目录更改为文本文件的目录。注意,带空格的文件名仍然需要type。

我希望这能帮助到一些人!