2017-04-25 30 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>>を使用します。

ヘッダーの場合は、すべての行でヘッダーを取得する必要はありません。ただ、一度そのようにそれらを取得する:

// 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; 

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ファイルを作成するには、あなたがこれを行うことができます:

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

次は、このような行を取得することができます

注::私のコード例で私は使用していますType Inference

Try-With-Resources Statementを参照してください。

0

正直、あなたがしようとしているものについてはwriteAll method in CSVWriter and pass in the ResultSetをお勧めします。

writer.writeAll(rs, true); 

2番目のパラメータはインクルード列の名前で、csvファイルの最初の行が列名になります。その後、ファイルを読み込むと、そのファイルをあなたのマップに変換することができます(必要な場合は、いつタイプを読み込んでいるかわからない限りすべての文字列になります)。

希望に役立ちます。

Scott: