Windows 从分隔符之间没有数据的文件读取批处理文件

Windows batch file reading from file with no data between delimiters

我有一个多行 CSV,如下所示:

A/B//D
E//G/H

我正在尝试使用这些 a、b、c(在本例中为空白)和 d 作为参数输入。我今天的代码是跳过 C 并将 D 分配给第 3 个位置。

FOR /F " tokens=1,2,3,4 delims=/" %%i IN (MYCSV.txt"') DO tabcmd get "MyView.png?Filter1=%%A&Filter2=%%B&Filter3=%%C&Filter4=%%D" -f "Outputfile.png"

预期输出:

Mview.png?Filter1=A&Filter2=B&Filter3=&Filter4=D

我得到的是: Mview.png?Filter1=A&Filter2=B&Filter3=D&Filter4=

任何帮助将不胜感激。谢谢

您可以将 powershell 用作具有 Import-Csv cmdlet 的批处理工具。
它需要 headers 的临时分配,可以在保存时将其删除。
输出的 csv 将包含双引号文件和您选择的分隔符。

powershell -Nop -C "(Import-Csv '.\mycsv.txt' -Delim '/' -Header (1..4))|ConvertTo-Csv -NoType|Select -Skip 1|Set-Content '.\my.csv'"

示例输出:

> type my.csv
"A","B","","D"
"E","","G","H"

for /F 将相邻的分隔符合并为一个用于解析文本。但是,您可以阅读整行,暂时插入一个非定界符以拆分为标记,然后再将其删除,如下所示:

rem // Read whole lines:
for /F "usebackq delims=" %%A in ("MyCSV.txt") do (
    rem // Store current line:
    set "LINE=%%A"
    rem // Toggle delayed expansion to avoid trouble with `!`:
    setlocal EnableDelayedExpansion
    rem /* Prepend `_` to line string and replace every `/` by `/_`, hence every `/`-delimited
    rem    item becomes preceded by `_`, hence no more adjacent delimiters `/` can occur: */
    for /F "tokens=1-4 delims=/" %%a in ("_!LINE:/=/_!") do (
        endlocal
        rem // Get items preceded with `_`:
        set "ITEM1=%%a"
        set "ITEM2=%%b"
        set "ITEM3=%%c"
        set "ITEM4=%%d"
        setlocal EnableDelayedExpansion
        rem // Return rebuild line string with delimiters `,` and preceding `_` removed:
        echo(!ITEM1:~1!,!ITEM2:~1!,!ITEM3:~1!,!ITEM4:~1!
    )
    endlocal
)

当然,如果只是替换分隔符,您可以简单地这样做:

rem // Read whole lines:
for /F "usebackq delims=" %%A in ("MyCSV.txt") do (
    rem // Store current line:
    set "LINE=%%A"
    rem // Toggle delayed expansion to avoid trouble with `!`:
    setlocal EnableDelayedExpansion
    rem // Return new line string with delimiters replaced:
    echo(!ITEM:/=,!
    endlocal
)