【问题标题】:Write List of Maps to a CSV将地图列表写入 CSV
【发布时间】:2017-04-25 01:26:08
【问题描述】:

我有一个独立的应用程序,它连接到 SQL 数据库并将 ResultSet 保存在 Map 列表中。这是我到目前为止所拥有的:

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 中?任何线索和建议。感谢您的帮助。

【问题讨论】:

  • 您说您很难将列表保存到文件中。你试过什么?
  • 我在关注这个例子@MichaelMarkidis:stackoverflow.com/questions/31172003/…
  • 您是否尝试使用库?你能在你的问题中显示你尝试过的代码吗?
  • 对此@MichaelMarkidis的任何帮助

标签: java csv jdbc hashmap opencsv


【解决方案1】:

由于每条记录都会以相同的顺序包含相同的列,所以我将只使用 List&lt;List&lt;Object&gt;&gt; 来表示行。

对于标题,您不需要在每一行都获取它们。像这样得到它们一次:

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

【讨论】:

    【解决方案2】:

    老实说,我建议您使用writeAll method in CSVWriter and pass in the ResultSet

    writer.writeAll(rs, true);
    

    第二个参数是包含列名,因此 csv 文件中的第一行将是列名。然后,当您阅读该文件时,您可以根据需要将其翻译回您的 Map (尽管它将是所有字符串,除非您在阅读时知道它的类型是什么)。

    希望对您有所帮助。

    斯科特:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多