当delim为','时,批处理脚本跳过.CSV中的空白条目

时间:2013-07-09 19:53:09

标签: for-loop batch-file batch-processing

我有一个.CSV,我试图从数据中创建另一个文件,但是当我运行它时,它会跳过空白条目。例如,如果是一条线 value,value,value,,,value 而我试图获得第4列,它会吐出第6列。大概是因为它是下一个有效值。我不希望它跳过空白条目,因为它可能弄乱我正在尝试制作的表格。有谁知道如何解决这个问题? (欢迎任何提示,因为我吮吸批处理脚本)

这是我的剧本:

FOR /F "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14 delims=," %%a in (file.csv) DO (
    echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n
)
pause

2 个答案:

答案 0 :(得分:6)

这是FOR / F循环的标准行为,连续delim仅用作一个分隔符 但是你可以使用第二种FOR / F的解决方法 使用另一个字符为每个列添加前缀,将该行拆分为delim并删除前缀。

setlocal EnableDelayedExpansion
FOR /F "delims=" %%L in (test.bat) DO (
    set "line=%%L,,,,,,,,"
    set "line=#!line:,=,#!"
    FOR /F "tokens=1,2,3,4 delims=," %%a in ("!line!") DO (
        set "param1=%%a"
        set "param2=%%b"
        set "param3=%%c"
        set "param4=%%d"
        set "param1=!param1:~1!"
        set "param2=!param2:~1!"
        set "param3=!param3:~1!"
        set "param4=!param4:~1!"
        echo !param1! !param2! !param3! !param4!
    )
)

答案 1 :(得分:1)

正如jeb已经提到his answerfor /F将连续分隔符视为一个。为了避免这种情况,您可以将每个分隔符,替换为",",并将每个完整行括在""之内,这样每个字段都显示为"",这很容易最后由~变量的for /F修饰符删除;因此,以后不需要再进行字符串操作(如子字符串扩展):

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "usebackq delims=" %%# in ("file.csv") do (
    set "LINE=%%#"
    setlocal EnableDelayedExpansion
    for /F "tokens=1-4 delims=," %%A in (^""!LINE:,="^,"!"^") do (
        endlocal
        echo Field 1: %%~A
        echo Field 2: %%~B
        echo Field 3: %%~C
        echo Field 4: %%~D
        setlocal EnableDelayedExpansion
    )
    endlocal
)
endlocal

如果数据本身包含,个字符,则这可能无法正常工作(请记住,如果字段被包含在原始CSV文件中的,内,""不会被视为分隔符)。

延迟扩展的切换是为了不丢失数据中的任何惊叹号。