Groovy拆分csv和空字段

时间:2013-07-12 00:52:25

标签: groovy

Groovy拆分似乎忽略了空字段。

以下是代码:

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

仅打印..

abc abc

似乎忽略空字段。如何使用拆分来检索空字段?

2 个答案:

答案 0 :(得分:11)

首先,Groovy不提供方法split(regex),它由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"}

我宁愿使用limit 0或重载的分割来丢弃不需要的空字符串。

使用-1作为限制的说明:
强调来自javadoc的以下陈述。

  

limit参数控制模式的次数   应用因此会影响结果数组的长度。如果   限制n大于零,那么模式将应用于   大多数n - 1次,数组的长度不会大于n,并且   数组的最后一个条目将包含除最后一个匹配之外的所有输入   分隔符。如果n是非正数,那么该模式将被应用为   尽可能多次,阵列可以有任何长度。如果n为零   那么模式将尽可能多地应用于数组   可以有任何长度,尾随空字符串将被丢弃。

答案 1 :(得分: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, , ]