目标是创建一个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);
}
答案 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 })
}