【问题标题】:Groovy split csv and empty fieldsGroovy 拆分 csv 和空字段
【发布时间】:2013-07-12 00:52:25
【问题描述】:

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

代码如下:

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

只打印..

abc abc

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

【问题讨论】:

  • 如果您正在解析 CSV,您应该使用 CSV parser
  • 正确@tim_yates。我也会这样做。

标签: groovy


【解决方案1】:

首先,方法split(regex)不是G​​roovy提供的,是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 为零 那么该模式将被应用尽可能多的次数,数组 可以有任意长度,并且尾随的空字符串将被丢弃。

【讨论】:

  • 谢谢,您的解决方案使我免于编写复杂的正则表达式匹配只是拆分单词。我仍然不明白为什么它首先不是 String.split 的默认行为!
【解决方案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, , ]

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多