我有一个代码可以读取组中的大文本文件。我把问题部分分开了一个小得多的代码,只包含for循环,这个问题就出现了。代码工作的方式是它读取100行,然后退出for循环,返回,跳过100行,读取接下来100,然后跳过200,读取下一个100 ......等等。但是for循环中的选项似乎有问题。它让我“在这个时候出乎意料。就像标题一样。
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
我真的很感激答案,因为在我解决这个问题之前我无法继续工作。
答案 0 :(得分:3)
for /f
不允许跳过0行。试试像
setlocal enabledelayedexpansion
set "skiplines=0"
:loop
if %skipLines%==0 ( set "skip=" ) else (set "skip=skip=%skipLines%")
set /a line=0
(FOR /F "%skip% delims=" %%G IN (doc1.txt) DO (
set /a "line+=1"
echo line!line! %%G
if !line! EQU 100 goto :endloop
)) || goto endFile
:endloop
set /a skipLines+=100
pause
goto :loop
:endFile
echo File processed
完整的skip
子句存储在变量中,具体取决于要跳过的行数。如果%skipLines%
为0,则不得使用skip
子句。
在for
循环的末尾有一个条件执行运算符来测试文件是否已经完全处理。当for /f
无法从文件中读取任何内容时(我们正在跳过所有行),它会引发错误级别并执行goto endFile
。
在任何情况下,您都应该注意for /f
将始终将文件中的所有数据加载到内存中。 skip
子句仅指示在do
子句中开始执行代码的位置。
答案 1 :(得分:2)
正如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
但是,您可以使用一种更简单的方法,将文件重定向到子例程,这样您就可以通过放置在set /P
循环中的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