我想逐行读取一个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 :(得分: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
标签之前。处理器可以理解为物理文件结束(冒号必需)
当要执行括在括号中的复合语句时, 该语句首先从所有的开括号中解析出来 匹配近括号的方法。
目前,任何%var%
都会被var
的{{1}}替换
环境在它被分配的时间(即其 PARSE-TIME 值。)
THEN 如果语句似乎有效,则执行。
有三种常用方法可以访问 RUN-TIME 值
变量(例如,作为FOR
循环执行。)
1 / SETLOCAL ENABLEDELAYEDEXPANSION
切换到其中的模式
!VAR!可用于访问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
需要注意的几个项目:
指令
如果ERRORLEVEL n echo errorlevel是n OR GREATER
始终 解释ERRORLEVEL
IF SET VAR
始终 解释VAR
永远不应该像{ERRORLEVEL和TIME一样magic variables
设定。如果你执行
SET ERRORLEVEL = dumb
然后ERRORLEVEL
将采用值dumb
,因为当前
环境中的值优先于系统分配的值。
答案 1 :(得分:0)
您应该在if
和for
循环中使用DelayedExpansion并处理括号:
@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
您的代码在许多方面都不起作用。