2017-06-12 100 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 –

相關問題