我有一个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}"
}
}
答案 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