【问题标题】:Batch script skipping blank entries in a .CSV when delim is ','当 delim 为“,”时,批处理脚本跳过 .CSV 中的空白条目
【发布时间】:2013-07-09 19:53:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这是 FOR/F 循环的标准行为,连续的分隔符仅用作一个分隔符。
    但是您可以使用带有第二个 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!
        )
    )
    

    【讨论】:

      【解决方案2】:

      正如jeb 在his answer 中已经提到的,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 文件中的 "" 中,, 不会被视为分隔符)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多