2015-06-10 86 views
1

我有一個代碼,應該讀取一個大的文本文件在組中。我已經分開問題部分在一個更小的代碼中只包含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

由於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 
+0

我喜歡子程序重定向。但是'set/p'行讀取和'errorlevel'檢查輸入文件是否包含任何空行是有問題的。 –

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