【问题标题】:java groovy split array for csv output用于csv输出的java groovy拆分数组
【发布时间】:2023-04-02 09:16:01
【问题描述】:

目标是创建一个 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 脚本 ok。我可以让它迭代和循环并打印行。但是我不想手动编写所有 '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);
}

【问题讨论】:

    标签: java arraylist groovy export-to-csv


    【解决方案1】:

    如果您使用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&lt;GroovyRowResult&gt;,其中GroovyRowResult实现Map,然后你可以应用collect

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

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2017-09-30
      • 2016-04-15
      相关资源
      最近更新 更多