我在csv文件上运行下面的批处理脚本。
@echo off
set "filename=test.csv"
for /f "USEBACKQtokens=*" %%A in ("%filename%") do (
call :myecho "%%A"
)
pause
:myecho
echo %1
GOTO :eof
csv文件中的典型行如下所示:
Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20,729.89","$4,111.06","$4,453.08"
回声实际上会产生以下输出:
Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20,
不知何故,在第一个引号后,它在逗号处切断。我不明白为什么。有人可以解释,并告诉我如何在那里打印整条线?请注意,如果我直接在for循环中打印,则会打印整行。
答案 0 :(得分:3)
以下一行
call :myecho "%%A"
扩展为
call :myecho "Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20,729.89","$4,111.06","$4,453.08""
CALLed子例程的参数由<space>
,,
,;
,<tab>
,=
或<0x255>
中的任何一个分隔。引号内的分隔符将被忽略。 $20,729.89
中的逗号在原始CSV中引用,但在您的CALL中未引用它们,因为您添加了自己的封闭引号。因此,参数%1
以美元金额中的第一个未加引号的逗号结束。
如果要将包含引号和分隔符的字符串传递给子例程,则应通过环境变量通过引用传递它们。您应该使用延迟扩展来扩展变量,以便保护所有字符。但延迟扩展应在FOR循环中关闭,以便在扩展FOR循环变量时!
值不会被破坏。
@echo off
setlocal disableDelayedExpansion
set "filename=test.csv"
for /f "USEBACKQtokens=*" %%A in ("%filename%") do (
set "var=%%A"
call :myecho var
)
pause
exit /b
:myecho
setlocal enableDelayedExpansion
echo !%1!
exit /b