我是批处理文件脚本的新手。
我必须从CSV文件中读取数据。幸运的是,我找到了一种阅读方式。
但现在又遇到了一个障碍。
在阅读CSV文件时,我需要警告强制字段的空值。
以下是CSV文件的示例。
示例:
1,'EMPTY FIELD','abc','efg','tiger'
2, '172.16.2.22','xyz','str','lion'
必填字段为ipaddress
。如果该列为空或为null,我需要发出警报。
批处理文件:
@echo off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq tokens=1-6* delims=, " %%a in ("template.csv") do (
set sno=%%a
set ipaddress=%%b
set username=%%c
set password=%%d
set port=%%e
set domain=%%f
IF !ipaddress! == [] ECHO is empty
ECHO !sno!, !ipaddress!, !username!, !password!, !port!, !domain!
)
pause
要检查值是否为null我尝试了这个:
IF !ipaddress! == [] ECHO is empty
但是这个IF条件不起作用。
答案 0 :(得分:1)
批处理命令行
IF !ipaddress! == [] ECHO is empty
将环境变量ipaddress
的值与字符串[]
进行比较。是的,方括号没有特殊含义。用于字符串比较的命令 IF 始终只比较==
的剩余内容与==
的权利。
以下代码是为了
而编写的1,'','abc','efg','tiger'
2, '172.16.2.22','xyz','str','lion'
以及
1,,abc,efg,tiger
2, 172.16.2.22,xyz,str,lion
delims=,
的问题是命令 FOR 将一系列逗号解释为1分隔符。因此,有必要确保CSV文件中的行不包含1个或更多,,
,这是通过用,#
替换所有逗号来完成的。随后会从每个非空值中删除插入的#
。
@echo off
setlocal EnableDelayedExpansion
for /F "usebackq delims=" %%# in ("template.csv") do (
set "Row=%%#"
set "Row=!Row:, =,!"
set "Row=!Row:,=,#!"
for /F "tokens=1-6 delims=," %%a in ("!Row!") do (
set "sno=%%a"
set "ipaddress=%%b"
if "!ipaddress!" == "#" (
echo IP address is empty in: %%#
) else if "!ipaddress!" == "#''" (
echo IP address is empty in: %%#
)
set "ipaddress=!ipaddress:~1!"
set "username=%%c"
if not "!username!" == "" set "username=!username:~1!"
set "password=%%d"
if not "!password!" == "" set "password=!password:~1!"
set "port=%%e"
if not "!port!" == "" set "port=!port:~1!"
set "domain=%%f"
if not "!domain!" == "" set "domain=!domain:~1!"
echo !sno!, !ipaddress!, !username!, !password!, !port!, !domain!
)
)
endlocal
pause
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?
答案 1 :(得分:0)
这是一种使用标准for
循环解析每行的CSV数据的方法。唯一的缺点是整个文件中不允许使用字符*
和?
。需要提供CSV文件作为命令行参数:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in (%*) do (
set "FILE=%%~F"
set /A "LIDX=0"
for /F usebackq^ delims^=^ eol^= %%L in ("%%~F") do (
set "LINE=%%L"
set /A "LIDX+=1, IIDX=0"
setlocal EnableDelayedExpansion
for %%I in ("!LINE:,=" "!") do (
endlocal
set "ITEM=%%~I"
set /A "IIDX+=1"
setlocal EnableDelayedExpansion
if "!ITEM:~,1!"=="'" if "!ITEM:~-1!"=="'" set "ITEM=!ITEM:~1,-1!"
if "!ITEM!"=="" (
if !IIDX! EQU 2 (
>&2 echo Empty item found: file "!FILE!", row !LIDX!, column !IIDX!.
)
)
)
endlocal
)
)
endlocal
exit /B
变量LIDX
和IIDX
分别包含行索引和列索引。如果第二列包含空值,则返回错误消息。