2017-06-12 134 views
0

我有一个包含3列和多行的CSV文件。如何提供从CSV文件中提取变量的Windows批处理文件

我想在Windows运行命令命令提示符,并从一个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

你也许可以添加一个双引号到每行的开始和结尾,同时用双引号空格双引号替换每个逗号。 – Compo

+0

附加自己的代码来编辑过的问题,您的CSV文件的样本线。 'FOR/F “令牌= 1-3 delims =” %%甲在( '型your.csv')DO echo命令 “%%〜A” “%%〜B” “%%〜C”'是可能全部你需要。 – LotPings

回答

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" 
) 
) 
+0

我删除了回声,它一切正常。非常感谢@dbenham –

相关问题