2016-08-16 204 views
0

我想遍歷一個CSV般的字符串:元素;元素;元素; [...]元素刪除空間

所以,我用這個類型的循環:

for %%a in (%%l) do (
    code ... 
) 

with %% a my elements and %% l my line。

它的工作原理,但我有一個問題。我的元素可以有一個空間,循環自動計算一個元素與兩個元素的空間。例如,如果我將05/05/2015 15:05:12作爲元素,它將在兩圈內解析,即05/05/2015然後15:05:12。所以,我想把這個空間當作一個分離器。可能嗎 ?

+0

改爲使用'FOR/F'。 – Squashman

+0

使用「delims =;」,我迭代第一個元素,但不迭代其他元素... –

+0

將'%% l'存儲在類似'set「的變量變量中LINE = %% l」',然後執行此操作(假設[延遲擴展](http://ss64.com/nt/delayedexpansion.html)已啓用):'for %% a in(「!LINE:; =」;「!」)do(rem使用'%%〜a '在這裏刪除引號。)' – aschipfl

回答

2

for使用SPACETAB,;=和非休息空間(ASCII 0xFF)作爲分隔符(如cmd確實太少),除非它們被一對"內包圍。

我們可以利用的是:

rem The following is placed inside your `for /F` loop: 
set "LINE=%%l" 
setlocal EnableDelayedExpansion 
for %%a in ("!LINE:;=";"!") do (
    rem Use `%%~a` here to remove quotes. 
) 
endlocal 

部分"!LINE:;=";"!"包圍線""之間和";"替換每個分隔符;,所以我們得到引述; - 分隔的項目列表。

例如,線...:

element;05/05/2015 15:05:12;element 

...變成這樣:

"element";"05/05/2015 15:05:12";"element" 

因此,SPACE出現在一個之間對",所以它不被視爲廣告elimiter了。

注意delayed expansion必須用在這裏,因爲有相同的代碼塊,即您的for /F %%l循環中讀取寫入變量(LINE)。

+0

謝謝,這是一個很好的解釋,以您的代碼! –