如何在Groovy中调用split之前处理单个元素数组字符串?

时间:2017-11-09 01:02:11

标签: string csv groovy

我正在阅读Groovy中的CSV文件,就像这样......

inputFile.eachLine { rawLine ->

    def line = rawLine.split(',')

    def name = line[0]
    def occupation = line[1]
}

但是CSV中的某些值在逗号之前只有一个条目,如下面的第三个示例...

   Jim, Salesman
   Michael, Manager
   Creed,
   Pam, Receptionist

当它到达第三个条目时,它会给出一个java.lang.ArrayIndexOutOfBoundsException:1。

检查此项并使其跳过此类记录的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

如果您允许使用第三方库作为答案,则可以采用以下方法:( @Grab功能可以在脚本中使用此功能。)

@Grab('com.xlson.groovycsv:groovycsv:1.0')

import static com.xlson.groovycsv.CsvParser.parseCsv

def inputFile = new File("abc.csv")
def text = inputFile.getText()

def data = parseCsv(text)

data.each { def line ->
    def name = line.getAt(0)
    def occupation = line.getAt(1)

    println "name: ${name} occupation: ${occupation}"
}

它处理用例而不做任何更改,解析器比大多数人想要实现的更强大。

答案 1 :(得分:1)

在Java中,您可以像这样检查数组的长度:

String[] line = rawLine.split(',');
if(line.length > 1) {
    String name = line[0];
    String occupation = line[1];
    ...
}

在groovy中应该是类似的东西。

答案 2 :(得分:0)

一个非常简单的解决方案就是一个例子:

def s = "S,"
def l = s.tokenize(",")
def x = l[1]?:"No Value"
println x

打印"没有价值"在控制台

因此,在您的代码中,您可以使用:

inputFile.eachLine { rawLine ->
    def line = rawLine.tokenize(',')
    def name = line[0]
    def occupation = line[1]?:""
}