如何提供从CSV文件中提取变量的Windows批处理文件
我有一个包含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"
谢谢!
假设您发布的代码和示例文件是准确的,那么您有两个无关的问题。
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"
)
)
我删除了回声,它一切正常。非常感谢@dbenham –
你也许可以添加一个双引号到每行的开始和结尾,同时用双引号空格双引号替换每个逗号。 – Compo
附加自己的代码来编辑过的问题,您的CSV文件的样本线。 'FOR/F “令牌= 1-3 delims =” %%甲在( '型your.csv')DO echo命令 “%%〜A” “%%〜B” “%%〜C”'是可能全部你需要。 – LotPings