Loops "这个时候出人意料,
我有一个代码,它应该分组读取一个大的文本文件。我将问题部分分离在一个更小的代码中,该代码只包含发生此问题的for循环。代码的工作方式是读取100行,然后跳出for循环,返回,跳过100行,读取下一个100行,然后跳过200行,读取下一个100行…等等。但是for循环中的选项似乎有问题。这给了我一个意想不到的结果。就像标题中一样Loops "这个时候出人意料,,loops,batch-file,for-loop,Loops,Batch File,For Loop,我有一个代码,它应该分组读取一个大的文本文件。我将问题部分分离在一个更小的代码中,该代码只包含发生此问题的for循环。代码的工作方式是读取100行,然后跳出for循环,返回,跳过100行,读取下一个100行,然后跳过200行,读取下一个100行…等等。但是for循环中的选项似乎有问题。这给了我一个意想不到的结果。就像标题中一样 setlocal enabledelayedexpansion set skipline=0 :loop FOR /F "skip=%skipline%" %%G IN
setlocal enabledelayedexpansion
set skipline=0
:loop
FOR /F "skip=%skipline%" %%G IN (doc1.txt) DO (
if NOT !line! GTR 100 (
set /a line+=1
echo line!line! %%G
) else goto :endloop
)
:endloop
set /a line=0
set /a skipline+=100
pause
goto :loop
我非常感谢您的回答,因为在解决此问题之前,我无法继续我的工作。for/f将不允许您跳过0行。请尝试类似的方法
延迟扩展
设置Skipline=0
:循环
如果%skipLines%==0,则设置跳过=否则设置跳过=跳过=%skipLines%
设置/a行=0
对于doc1.txt中的/F%skip%delims=%%G DO
设置/a行+=1
回音线!回音线!%%G
if!line!EQU 100转到:endloop
||转到结束文件
:endloop
集/a Skipline+=100
暂停
转到:循环
:endFile
已处理回显文件
根据要跳过的行数,完整skip子句存储在变量中。如果%skipLines%为0,则不必使用skip子句
在for循环的末尾有一个条件执行运算符,用于测试文件是否已被完全处理。当for/f无法从文件中读取任何内容时,我们将跳过所有行,它将引发errorlevel,并执行goto endFile
在任何情况下,您都应该注意for/f将始终将文件中的所有数据加载到内存中。skip子句仅指示从何处开始执行do子句中的代码。for/f将不允许您跳过0行。请尝试类似的方法
延迟扩展
设置Skipline=0
:循环
如果%skipLines%==0,则设置跳过=否则设置跳过=跳过=%skipLines%
设置/a行=0
对于doc1.txt中的/F%skip%delims=%%G DO
设置/a行+=1
回音线!回音线!%%G
if!line!EQU 100转到:endloop
||转到结束文件
:endloop
集/a Skipline+=100
暂停
转到:循环
:endFile
已处理回显文件
根据要跳过的行数,完整skip子句存储在变量中。如果%skipLines%为0,则不必使用skip子句
在for循环的末尾有一个条件执行运算符,用于测试文件是否已被完全处理。当for/f无法从文件中读取任何内容时,我们将跳过所有行,它将引发errorlevel,并执行goto endFile
在任何情况下,您都应该注意到for/f将始终将文件中的所有数据加载到内存中。skip子句仅指示从何处开始执行do子句中的代码。正如MC ND在其回答中指出的,问题是skip for选项不能跳过0行。解决代码中这一点的方法如下:
setlocal enabledelayedexpansion
set skipline=0
set "skip="
:loop
set line=0
FOR /F "%skip%" %%G IN (doc1.txt) DO (
set /a line+=1
echo line!line! %%G
if !line! EQU 100 goto :endloop
)
:endloop
set /a skipline+=100
set "skip=skip=%skipline%"
pause
goto :loop
但是,您可以使用一种更简单的方法,将文件重定向到子例程中,这样您就可以通过放置在比您的方法运行速度更快的FOR/L循环中的set/p命令来读取那里的行。当到达文件结尾时,将errorlevel设置为1,因此这是结束进程的一种简单方法
setlocal EnableDelayedExpansion
call :ProcessFile < doc1.txt
goto :EOF
:ProcessFile
for /L %%i in (1,1,100) do (
set /P "line="
if errorlevel 1 goto endFile
echo line%%i !line!
)
pause
goto ProcessFile
:endFile
exit /B
正如MC ND在其回答中指出的,问题在于skip FOR option不能跳过0行。解决代码中这一点的方法如下:
setlocal enabledelayedexpansion
set skipline=0
set "skip="
:loop
set line=0
FOR /F "%skip%" %%G IN (doc1.txt) DO (
set /a line+=1
echo line!line! %%G
if !line! EQU 100 goto :endloop
)
:endloop
set /a skipline+=100
set "skip=skip=%skipline%"
pause
goto :loop
但是,您可以使用一种更简单的方法,将文件重定向到子例程中,这样您就可以通过放置在比您的方法运行速度更快的FOR/L循环中的set/p命令来读取那里的行。当到达文件结尾时,将errorlevel设置为1,因此这是结束进程的一种简单方法
setlocal EnableDelayedExpansion
call :ProcessFile < doc1.txt
goto :EOF
:ProcessFile
for /L %%i in (1,1,100) do (
set /P "line="
if errorlevel 1 goto endFile
echo line%%i !line!
)
pause
goto ProcessFile
:endFile
exit /B
我喜欢子程序重定向。但是如果输入文件包含任何空行,set/p行读取和errorlevel检查中存在问题。我喜欢子程序重定向。但是如果输入文件包含任何空行,set/p行读取和errorlevel检查中存在问题。