Groovy加载.csv文件

时间:2010-04-12 10:06:47

标签: groovy csv import

如何在grails上的groovy中读取和导入.csv文件。我有.csv文件的数据和
需要使用用户界面导入到db。

6 个答案:

答案 0 :(得分:53)

在Groovy中使用CSV文件总是有不同的可能性。

由于Groovy可与Java完全互操作,因此您可以使用现有的CSV库之一,例如: OpenCSV

根据您使用的CSV文件的复杂程度,您还可以使用Groovy的标准文件/字符串处理功能:

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydb",
  "user", "pswd", "com.mysql.jdbc.Driver")
def people = sql.dataSet("PERSON")
new File("users.csv").splitEachLine(",") {fields ->
  people.add(
    first_name: fields[0],
    last_name: fields[1],
    email: fields[2]
  )
}

修改 Kelly Robinson刚刚写了一篇关于在Groovy中使用CSV文件的不同可能性的blog post

编辑#2: 作为他的GroovyCVS库的Leonard Axelsson recently released version 1.0,我认为我绝对应该将它添加到选项列表中。

答案 1 :(得分:9)

使用xlson' s GroovyCSV

@Grab('com.xlson.groovycsv:groovycsv:1.1')
import static com.xlson.groovycsv.CsvParser.parseCsv

for(line in parseCsv(new FileReader('countries.csv'), separator: ';')) {
    println "Country=$line.COUNTRY, Capital=$line.CAPITAL"
}

字段名称取自CSV文件的标题 如果CSV文件没有标题,则可以以编程方式指定字段名称。

答案 2 :(得分:1)

使用Apache Commons-CSV

@Grab('org.apache.commons:commons-csv:1.2')
import org.apache.commons.csv.CSVParser
import static org.apache.commons.csv.CSVFormat.*

import java.nio.file.Paths

Paths.get('countryInfo.txt').withReader { reader ->
    CSVParser csv = new CSVParser(reader, DEFAULT.withHeader())

    for (record in csv.iterator()) {
        println record.dump()
    }
}

Commons-CSV有很好的API,我建议这样做。

使用GroovyCSV

@Grab('com.xlson.groovycsv:groovycsv:0.2')
import com.xlson.groovycsv.CsvParser

def csv = '''Name,Lastname
Mark,Andersson
Pete,Hansen'''

def data = new CsvParser().parse(csv)
for(line in data) {
    println "$line.Name $line.Lastname"
}

(取自它的样本)

最后的手段:正则表达式。

以下是我解析might contain a quoted escaped string in it's fourth column

文件的方法
    File detailedStatsFile = new File("stats.csv");
    detailedStatsFile.eachLine { line, number ->
        // Number Of Executions, Total Milliseconds, Milliseconds per execution, "Type"
        def match = line =~ /([^,]*?),\s*([^,]*?),\s*([^,]*?),\s*(?:([^",]+)|(?:"((?:[^\\"]++(?:\\")?)++)"))$/; //"

        if (!match.matches())
            continue;

        def numberOfExecs = Integer.valueOf(match.group(1));
        def totalMillis = Integer.valueOf(match.group(2));
        def detailedStatName = match.group(4);
        if (detailedStatName == null)
            detailedStatName = match.group(5).replaceAll('\\"','"');

答案 3 :(得分:1)

使用opencsv的示例

@Grab('com.opencsv:opencsv:4.0')
import com.opencsv.CSVReader
import com.opencsv.CSVWriter

class TestCsvReader {


    static main(args) {
        def csv = '''"a","b","c"
"d","e","f"
'''
        def Reader csvFileReader = new StringReader(csv)
        def Writer csvFileWriter = new PrintWriter(System.out)
        def CSVReader reader = new CSVReader(csvFileReader)
        def CSVWriter writer = new CSVWriter(csvFileWriter)

        reader.iterator().each { fields ->
            writer.writeNext(fields)
        }
        reader.close()
        writer.close()
    }
}

答案 4 :(得分:1)

SAP开发人员在SCPi SAP Cloud Platform Integration groovy iFlow中完成的生产代码示例:

String[] parseCSVLine(String line) {
    // Create a pattern to match breaks
    Pattern p =
            Pattern.compile(",(?=([^\"]*\"[^\"]*\")*(?![^\"]*\"))");
    // Split input with the pattern
    String[] fields = p.split(line);
    for (int i = 0; i < fields.length; i++) {
        // Get rid of residual double quotes
        fields[i] = fields[i].replace("\"", "");
    }
    return fields;
}

用法:

cols = parseCSVLine(line)
value = cols[0]
value = cols[1]

答案 5 :(得分:0)

我希望对接受的答案稍作调整:将列和值压缩在一起,而不是按数字索引每个索引。结果是代码略短。

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydb", "user", "pswd", "com.mysql.jdbc.Driver")
def people = sql.dataSet("PERSON")
def columns = ['first_name', 'last_name', 'email']
new File("users.csv").splitEachLine(",") {values ->
    people.add([columns, values].transpose().collectEntries())
}