2017-04-25 48 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 :)