2013-07-12 81 views
4

Groovy split似乎忽略空字段。Groovy split csv和空字段

下面是代碼:只有

line = abc,abc,,, 
line.split(/,/) 
println 

打印..

abc abc 

它似乎忽略空字段。如何使用split檢索空字段?

+1

如果您正在解析CSV,則應該使用[CSV解析器](http://stackoverflow.com/questions/11995167/groovy-split-csv) –

+0

正確@tim_yates。我也會這樣做。 – dmahapatro

回答

9

首先,方法split(regex)不是由Groovy的規定,它是Java提供。

其次,你可以實現你需要通過如下使用通用split(regex, int limit)什麼:

def line = "abc,abc,,," 

println line.split(/,/, -1) //prints [abc, abc, , , ] 
println line.split(/,/, -1).size() //prints 5 

注: -
字符串數組,你最終會在打印確認時將拋出一個編譯錯誤。但是,您可以將結果用作普通列表。

line.split(/,/, -1).each{println "Hello $it"} 

我寧願使用限制0或重載拆分放棄不需要的空字符串。

使用-1作爲限制說明:來自Javadoc中的下面陳述
應力。

limit參數控制應用模式爲 的次數,因此會影響結果數組的長度。如果 的限制值n大於零,那麼該模式將在 之前應用最多n-1次,該陣列的長度將不會大於n,並且該陣列的最後一個條目將包含超出最後匹配的 定界符的所有輸入。如果n是非正值,那麼該模式將盡可能多地應用爲 ,並且該數組可以具有任意長度。如果n爲零 那麼該模式將盡可能多地應用,數組 可以具有任何長度,並且尾隨的空字符串將被丟棄。

+0

謝謝,您的解決方案讓我無需編寫複雜的正則表達式匹配,只需分割單詞。我仍然不明白爲什麼它不是String.split的默認行爲! – janar

2

有趣。 split方法如預期般運作,只要最後有一個非空元素。

def list = 'abc,abc,,,abc'.split(/,/) 
println list // prints [abc, abc, , ] 
assert list.size() == 5 
assert list[0] == 'abc' 
assert list[1] == 'abc' 
assert list[2] == '' 
assert list[3] == '' 
assert list[4] == 'abc' 

也許你可能只是一個假的字符添加到字符串的結束和子列表中的結果:

def list = 'abc,abc,,,X'.split(/,/) - 'X' 
println list // prints [abc, abc, , ]