“此时出乎意料

时间:2015-06-10 07:07:50

标签: 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 (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

我真的很感激答案,因为在我解决这个问题之前我无法继续工作。

2 个答案:

答案 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