2

我有一个 .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
4

2 回答 2

6

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

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!
    )
)
于 2013-07-09T20:26:01.053 回答
1

正如jeb在他的回答中已经提到的那样,for /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 文件中,,则不将其视为分隔符)。""

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

于 2016-11-21T20:54:32.793 回答