Groovy-CSVParsing-如何在不使用任何外部库的情况下用逗号将双引号括起来的字符串

时间:2019-03-17 15:32:03

标签: csv groovy

我有一个CSV文件,如下所示

COL1,COL2,COL3,COL4
3920,10163,“明尼苏达州圣保罗”,双城

我想读取文件,并使用双引号将其拆分,而无需使用任何外部库。例如,在上面的CSV中,我们需要将其分为4部分,如
1. 3920
2. 10163
3. ST。明尼苏达州的保罗
4.双城

我尝试将正则表达式与愚蠢的代码一起使用,但从未成功。我想使用Groovy代码来完成这项工作。我尝试了用Java提供的其他解决方案。但是无法解决。

注意:我不想使用任何外部grails / Jars来完成这项工作。

def staticCSV = new File(staticMapping.csv")  
staticCSV.eachLine {line->
def parts = line.split(",(?=(?:[^\"]\"[^\"]\")[^\"]\${1})")
parts.each {
    println "${it}"
}
}

2 个答案:

答案 0 :(得分:0)

得到解决方案:

def getcsvListofListFromFile( String fileName ) {
    def lol = [] 
    def r1 = r1 = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*\$)"  

    try {
        def csvf =  new File(fileName)  ;
        csvf.eachLine { line ->
            def c1 = line.split(r1)  
            def c2 = [] 
            c1.each { e1 ->
                def s = e1.toString() ;
                s = s.replaceAll('^"', "").replaceAll('"\$', "") 
                c2.add(s)
            }
            lol.add(c2) ;
        }
        return (lol)  
    } catch (Exception e) {
        def eMsg = "Error Reading file [" + fileName + "] --- " + e.getMessage();
        throw new RuntimeException(eMsg) 
    }
}

答案 1 :(得分:0)

使用现成的库是一个更好的主意。但是你当然有你的理由。 这是您的替代解决方案。它用逗号分隔行,并重新组合最初属于在一起的部分(请参阅multipart)。

def content =
"""COL1,COL2,COL3,COL4
   3920,10163, "ST. PAUL, MN" ,TWIN CITIES
   3920,10163, "   ST. PAUL, MN " ,TWIN CITIES, ,"Bla,Bla, Bla" """  

content.eachLine {line ->
    def multiPart
    for (part in line.split(/,/)) {
        if (!part.trim()) continue         // for empty parts 
        if (part =~ /^\s*\"/) {            // beginning of a multipart
            multiPart = part
            continue
        } else if (part =~ /"\s*$/) {      // end of the multipart
            multiPart += "," + part
            println multiPart.replaceAll(/"/, "").trim()
            multiPart = null
            continue
        }        
        if (multiPart) {
            multiPart += "," + part
        } else {
            println part.trim()
        }        
    }
}

输出(您可以将代码直接复制到GroovyConsole中以运行。

COL1
COL2
COL3
COL4
3920
10163
ST. PAUL, MN
TWIN CITIES
3920
10163
ST. PAUL, MN
TWIN CITIES
Bla,Bla, Bla