我有一个包含3列和多行的CSV文件。
我想在Windows cmd提示符下运行命令,并从CSV文件向命令提供输入变量,以便:
cd C:\mricrogl
for /f "tokens=1-3 delims=," %%A in ('Q:\proc9\Code\dcm2bids.csv') Do Echo dcm2niix -b y -z y -o "%%~A" -f "%%~B" "%%~C"
我需要使用该命令迭代CSV文件的长度。
CSV文件的内容如下所示(没有标题),这3列是dcm2niix命令所需的输入变量%% ~A %% ~B和%% ~C。该命令要求输入变量(文件路径和文件名)采用双引号。当我一次执行一行'手动'在cmd提示符下,因此它的for语句和读取形成了我无法工作的CSV文件。
"V:\Output\folder1", "filename1", "Q:\Input\folder1"
"V:\Output\folder2", "filename2", "Q:\Input\folder2"
"V:\Output\folder3", "filename3", "Q:\Input\folder3"
谢谢!
答案 0 :(得分:1)
假设您发布的代码和示例文件准确无误,那么您就会遇到两个无关的问题。
<强> 1)强>
IN()子句使用单引号,这意味着FOR / F将尝试执行csv文件而不是简单地读取内容。
您必须删除单引号
for /f "tokens=1-3 delims=," %%A in(Q:\proc9\Code\dcm2bids.csv) do ...
如果csv路径有时可能包含空格,那么路径必须双引号,然后您需要USEBACKQ选项
for /f "usebackq tokens=1-3 delims=," %%A in("Q:\proc9 with spaces\Code\dcm2bids.csv") do ...
<强> 2)强>
您的第二个问题是每个引用列值之前的前导空格。当值中的第一个和最后一个字符为引号时,~
仅剥离外引号。您的第一个字符是空格,因此引号不会被删除。
无论如何,CSV不应该有这样的前导空格。
如果您控制csv文件的创建,那么我会修复该代码以消除前导空格,然后一切都应该有效。
或者,您可以依赖源中已存在的引号。但这只有在您知道引号始终存在时才有效:
... Do Echo dcm2niix -b y -z y -o %%A -f %%B %%C
如果您无法从源中删除空格,并且您不知道引号是否始终存在,那么您可以为每个标记使用额外的FOR循环来忽略不需要的空格:
cd C:\mricrogl
for /f "tokens=1-3 delims=," %%A in (Q:\proc9\Code\dcm2bids.csv) do (
for %%a in (%%A) do for %%b in (%%B) do for %%c in (%%C) do (
echo dcm2niix -b y -z y -o "%%~a" -f "%%~b" "%%~c"
)
)