用于csv输出的java groovy split数组

时间:2014-11-21 13:09:16

标签: java arraylist groovy export-to-csv

目标是创建一个groovy脚本,该脚本将从数据库中读取并导出到csv文件。我正在使用apache commons csv writer。我一直在使用这个javacode geeks - apache commons tutorial ..

此作品 我已经在这里帮助解释我想要实现的目标。

fileWriter = new FileWriter(fileName);
csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);
csvFilePrinter.printRecord(FILE_HEADER);

//Write a new student object list to the CSV file
for (Student student : students) {
   List studentDataRecord = new ArrayList();
   studentDataRecord.add(String.valueOf(student.getId()));
   studentDataRecord.add(student.getFirstName());
   studentDataRecord.add(student.getLastName());

   csvFilePrinter.printRecord(studentDataRecord);
}

我想在groovy / java中做什么。

我创建了一个groovy脚本调用数据库确定。我可以让它迭代并循环好并打印行。但是我不想手动编写所有'student.getFirstName'student.getLastName等调用。如果我将来修改查询会使其工作更多 - 我只想将其直接导出到仅修改查询的csv。

到目前为止这样的东西是我的...我不确定语法等。

#!/usr/bin/env groovy
import groovy.sql.Sql
import org.apache.commons.csv.CSVFormat

CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);
fileWriter = new FileWriter(fileName);
csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);
csvFilePrinter.printRecord(FILE_HEADER);

sql.eachRow("Select field1, field2, field3, etc FROM Student") {
    for( keyIndex  k ){
        List studentDataRecord = new ArrayList();
        studentDataRecord.add(k.value)
    }
    csvFilePrinter.printRecord(studentDataRecord);
}

1 个答案:

答案 0 :(得分:3)

如果您使用eachRow进行迭代,则每行都是groovy.sql.GroovyResultSet(严格来说,是groovy.sql.GroovyResultSetProxy)。由于它没有实现Map接口,因此您无法使用collect等。

因此,有几种选择:

按名称获取每个字段 (您要避免的字段)

sql.eachRow("select field1, field2, field3, etc from student") { row ->
   csvFilePrinter.printRecord([row.field1, row.field2, row.field3, ...])
}

按号码获取每个字段 (我猜您也不喜欢这样)

sql.eachRow("select field1, field2, field3, etc from student") { row ->
   csvFilePrinter.printRecord([row[0], row[1], row[2], ...])
}

使用基础ResultSet :获取列数,然后构建List

sql.eachRow("select field1, field2, field3, etc from student") { row ->
    def record = []
    row.getMetaData().columnCount.times { record << row[it] }
    csvFilePrinter.printRecord(record)
}

使用rows()方法 ,返回List<GroovyRowResult> GroovyRowResult实施Map然后您可以申请collect

def rows = sql.rows('select * from student').each { row ->
    csvFilePrinter.printRecord(row.collect { entry -> entry.value })
}