0

如果行的长度为 7999,我想逐行读取 CSV 文件并回显不同的内容。

我设法执行以下操作,它读取每一行并检查每行的字符数,但问题是我在 %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
)
4

2 回答 2

1

将此部分放入另一个子程序中,类似于:strlen

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

另请注意,您的主程序将在完成后继续进入您的子程序,因此在文件末尾(reports.csv)批处理将执行:strlen最后一次并通过EXIT

我建议添加一个

GOTO :EOF

紧接在:strlen标签之前。处理器理解这一点以转到 physiacl-file 结尾(需要冒号)

当要执行括在括号中的复合语句时,该语句首先从左括号一直解析到匹配的右括号。

此时,any%var%将替换为在它被解析时var来自环境的值(即它的PARSE-TIME值。)

那么如果该语句看起来有效,它就会被执行。

访问变量的RUN-TIME值有三种常用方法(例如,在FOR循环执行时)。

1/SETLOCAL ENABLEDELAYEDEXPANSION切换到 !var! 可用于访问var 2/的运行时值,以从 3/ 的运行时值CALL set var2=%%var%%设置 的值 执行子程序,内部或外部,其中 将是运行时值。var2var%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 n 回显错误级别为 n 或更大

    ALWAYS解释 RUN-TIME 值ERRORLEVEL

  2. IF SET VAR ALWAYS解释 RUN-TIME 值VAR

  3. magic variables永远不应该设置 ERRORLEVEL 和 TIME 。如果你执行

    设置错误级别=哑

thenERRORLEVEL将采用该值dumb,因为环境中的当前值优先于系统分配的值。

于 2013-03-27T11:58:35.583 回答
0

if您应该在和循环中使用 DelayedExpansionfor并注意括号:

@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

您的代码在许多领域都无法使用。

于 2013-03-27T11:52:46.860 回答