2013-03-27 2 views
0

Я хочу читать CSV файл построчно и эхо что-то другое, если длина линии 7999.длина каждой строки, используя пакетный файл

мне удается сделать что-то, как показано ниже, который читает каждую строку и проверяет количество символов для каждой строки, но проблема в том, что я не получаю никакого значения в% result%, а echo(%result% печатает пустое значение. Любая идея, что я делаю неправильно здесь? Благодаря

@echo off 
setlocal 
for /f "tokens=* delims= " %%a in (REPORTS.csv) do (
    set "line=%%a" 
    call :strlen result line 
    echo(%result% 
    if %result% EQU 7999 (
     echo %%a 
     echo(short=%result% 
    ) else (
     echo %%a 
     echo(long=%result% 
    ) 

    pause 
) 
:strlen <resultVar> <stringVar> 
(
    setlocal EnableDelayedExpansion 
    set "s=!%~2!#" 
    set "len=0" 
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
     if "!s:~%%P,1!" NEQ "" ( 
      set /a "len+=%%P" 
      set "s=!s:~%%P!" 
     ) 
    ) 
) 
( 
    endlocal 
    set "%~1=%len%" 
    exit /b 
) 

ответ

0

Вы должны использовать DelayedExpansion в if и for петель и заботиться о кронштейнах:

@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=* delims= " %%a in (REPORTS.csv) do (
set "line=%%a" 
call :strlen result line 
echo.!result! 
if !result! EQU 7999 (
    echo.%%a 
    echo.short=!result! 
) else (
    echo.%%a 
    echo.long=!result! 
) 
) 
pause 
goto:eof  

:strlen <resultVar> <stringVar> 
setlocal EnableDelayedExpansion 
set "s=!%~2!#" 
set "len=0" 
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if "!s:~%%P,1!" NEQ "" ( 
     set /a "len+=%%P" 
     set "s=!s:~%%P!" 
    ) 
) 
endlocal &set "%~1=%len%" 
exit /b 

Ваш код не всегда работает во многих областях.

1

Put этот раздел в другой подпрограммы, подобно :strlen

echo(%result% 
if %result% EQU 7999 (
    echo %%a 
    echo(short=%result% 
) else (
    echo %%a 
    echo(long=%result% 
) 

Заметим также, что ваша основная программа будет продолжать работать в вашу подпрограмму, когда закончил, так что при конца-файла (reports.csv) партии будет выполнить :strlen один последний раз и выйти через EXIT

Я бы рекомендовал добавить

GOTO :EOF 

IMME до метки :strlen. Это понимают процессор для перехода к конечному из-physiacl-файл (двоеточие требуется)

Когда соединение оператор, заключенный в скобках должны быть выполнен, оператора сначала анализируется с открытой скобки весь путь к близким скобкам.

В это время любой %var% заменяется значением, которое var «s из среды ВО ВРЕМЯ ОНО разобранные (т.е. его PARSE-TIME значение.)

ТОГДА если утверждение представляется действительным, оно выполняется.

Есть три распространенных способа доступа к RUN-TIME значение переменной (в качестве FOR цикла выполняет, например.)

1/SETLOCAL ENABLEDELAYEDEXPANSION, который переключается в режим, в котором ! Вар! может быть использованы для доступа к значению времени выполнения var 2/CALL set var2=%%var%%, чтобы установить значение var2 от значения во время выполнения var 3/Исполнительное подпрограмму, внутренней или внешней, внутри которого %var% будет значение времени выполнения.

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR %%i IN (1 2 3) DO (
ECHO START of run %%i 
ECHO using ^!time^! : !time! - PARSE TIME was %time% 
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%% 
CALL :report 
timeout /t 5 
ECHO using ^!time^! : !time! 
CALL ECHO using CALL %%%%TIME%%%% : %%TIME%% 
CALL :report 
ECHO END of run %%i 
ECHO. 
) 
GOTO :eof 

:report 
ECHO :report says TIME is %TIME% 
GOTO :eof 

Несколько пунктов отметить:

  1. Инструкция

    IF ERRORLEVEL п эхо Равен п ИЛИ ПОВЫШЕНИЕ

    ВСЕГДА интерпретирует значение RUN-TIME от ERRORLEVEL

  2. IF SET VARВСЕГДА интерпретирует значение RUN-TIME из VAR

  3. magic variables как ERRORLEVEL и TIME никогда не должны быть SET. Если выполнить

    SET ERRORLEVEL = немой

затем ERRORLEVEL примет значение dumb, поскольку текущая значение в среде имеет приоритет над значением системы присвоены.

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