2016-08-16 113 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

谢谢,这是一个很好的解释,以您的代码! –