【问题标题】:" was unexpected at this time“在这个时候是出乎意料的
【发布时间】:2015-06-10 07:07:49
【问题描述】:

我有一个代码应该分组读取一个大文本文件。我已经将问题部分分成了一个更小的代码,其中仅包含发生此问题的 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

我真的很感激你的回答,因为在我解决这个问题之前我不能继续我的工作。

【问题讨论】:

    标签: loops batch-file for-loop


    【解决方案1】:

    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 子句中的代码。

    【讨论】:

      【解决方案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
      

      但是,您可以使用更简单的方法,将文件重定向到子例程中,因此您可以通过放置在FOR /L 循环中的set /P 命令读取其中的行,该循环比您的方法运行得更快。当到达文件末尾时,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检查输入文件是否包含任何空行有问题。
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多