2017-04-25 168 views
0

我有一個獨立的應用程序,它連接到SQL數據庫並將ResultSet保存在Map列表中。這是我到目前爲止:將地圖列表寫入CSV

List<Map<String, Object>> rows; 
stmt = conn.createStatement(); 
Resultset rs = stmt.executeQuery(queryString); 
ResultSetMetaData rsmd; //Properties of Resultset object and column count 

while(rs.next){ 
    Map<String, Object> rowResult = new HashMap<String, Object>(columnCount); 
    for(int i =1; i <=columnCount; i++){ 
    rowResult.put(rsmd.getColumnName(i), rs.getObject(i)); 
    } 
    rows.add(rowResult); 
} 

//WRITE TO CSV 
String csv = "C:\\Temp\\data.csv"; 
CSVWriter writer = new CSVWriter(new FileWriter(csv)); 

//Write the record to file 
writer.writeNext(rows); 

//close the writer 
writer.close(); 

如何將列的這些「行」添加到帶有列的csv?任何線索和建議。感謝您的幫助。

+1

你說你很難將列表保存到文件中。你有什麼嘗試? –

+0

我正在關注這個例子@MichaelMarkidis:http://stackoverflow.com/questions/31172003/java-write-hashmap-to-a-csv-file – user2501165

+1

你想使用庫嗎?你能顯示你在你的問題中嘗試過的代碼嗎? –

回答

0

由於每條記錄都具有相同順序的相同列,因此我只是使用行的List<List<Object>>

對於標題,你不需要在每一行都得到它們。只是讓他們一次像這樣:

List<String> headers = new ArrayList<>(); 
for (int i = 1; i <= columnCount; i++) 
{ 
    String colName = rsmd.getColumnName(i); 
    headers.add(colName); 
} 

接下來,你可以得到這樣的行:

List<List<Object>> rows = new ArrayList<>(); 

while(rs != null && rs.next) 
{ 
    List<Object> row = new ArrayList<>(); 
    for(int i =1; i <=columnCount; i++) 
    { 
     row.add(rs.getObject(i)); 
    } 
    rows.add(row); 
} 

最後,要創建CSV文件,你可以這樣做:

// create the CSVWriter 
String csv = "C:\\Temp\\data.csv"; 
CSVWriter writer = new CSVWriter(new FileWriter(csv)); 

// write the header line 
for (String colName : headers) 
{ 
    writer.write(colName); 
} 
writer.endRecord(); 

// write the data records 
for (List<Object> row : rows) 
{ 
    for (Object o : row) 
    { 
     // handle nulls how you wish here 
     String val = (o == null) ? "null" : o.toString(); 
     writer.write(val); 
    } 
    writer.endRecord(); 
} 

// you should close the CSVWriter in a finally block or use a 
// try-with-resources Statement 
writer.close; 

注意:在我的代碼示例中,我正在使用Type Inference

Try-With-Resources Statement

0

老實說,你正在嘗試做什麼我會建議你使用writeAll method in CSVWriter and pass in the ResultSet

writer.writeAll(rs, true); 

第二個參數是包含列名,所以您的csv文件中的第一行將是列名。然後,當你閱讀文件時,如果你想要的話,你可以把它翻譯回你的地圖(儘管它會是所有的字符串,除非你知道什麼時候你正在閱讀它的類型)。

希望有所幫助。

Scott :)