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
)
我有一个多行 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
)