2014-11-21 22 views
1

目標是創建一個groovy腳本,該腳本將從數據庫中讀取並導出到csv文件。我正在使用apache commons csv編寫器。我一直在使用這個javacode geeks - apache commons tutorial ..java groovy分割數組用於csv輸出

這工作 我已經把這裏幫忙解釋一下,我試圖實現。

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); 
} 

回答

2

如果您正在使用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 }) 
}