如何在使用批处理文件读取csv文件时查找空值?

时间:2016-10-13 18:31:25

标签: batch-file

我是批处理文件脚本的新手。

我必须从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条件不起作用。

2 个答案:

答案 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

变量LIDXIIDX分别包含行索引和列索引。如果第二列包含空值,则返回错误消息。