2015-06-10 5 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 команд, помещенных в a 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 /f ничего не может прочитать из файла (мы пропускаем все строки), он повышает уровень ошибок и выполняется goto endFile.

В любом случае, следует отметить, что for /f всегда будет загружать все данные в файле в памяти. Предложение skip указывает, где начать выполнение кода внутри предложения do.

Смежные вопросы