Java - 将hashmap写入csv文件

act*_*ner 4 java csv hashmap supercsv

我有一个带有String键和String值的hashmap.它包含大量的键及其各自的值.

例如:

key | value
abc | aabbcc
def | ddeeff
Run Code Online (Sandbox Code Playgroud)

我想将此hashmap写入csv文件,以便我的csv文件包含如下行:

abc,aabbcc
def,ddeeff
Run Code Online (Sandbox Code Playgroud)

我在这里使用supercsv库尝试了以下示例:http://javafascination.blogspot.com/2009/07/csv-write-using-java.html .但是,在此示例中,您必须为要添加到csv文件的每一行创建一个hashmap.我有大量的键值对,这意味着需要创建几个哈希映射,每个哈希映射包含一行的数据.我想知道是否有更优化的方法可用于此用例.

提前致谢!

Sea*_*ght 7

这样的事情应该可以解决问题:

String eol = System.getProperty("line.separator");

try (Writer writer = new FileWriter("somefile.csv")) {
  for (Map.Entry<String, String> entry : myHashMap.entrySet()) {
    writer.append(entry.getKey())
          .append(',')
          .append(entry.getValue())
          .append(eol);
  }
} catch (IOException ex) {
  ex.printStackTrace(System.err);
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是用一个简单的2元素HashMap在本地进行了测试,对我来说很好。 (2认同)

Aja*_*mar 7

使用Jackson API,Map或Map of List可以用CSV文件编写.请在此处查看完整示例

 /**
 * @param listOfMap
 * @param writer
 * @throws IOException
 */
public static void csvWriter(List<HashMap<String, String>> listOfMap, Writer writer) throws IOException {
    CsvSchema schema = null;
    CsvSchema.Builder schemaBuilder = CsvSchema.builder();
    if (listOfMap != null && !listOfMap.isEmpty()) {
        for (String col : listOfMap.get(0).keySet()) {
            schemaBuilder.addColumn(col);
        }
        schema = schemaBuilder.build().withLineSeparator(System.lineSeparator()).withHeader();
    }
    CsvMapper mapper = new CsvMapper();
    mapper.writer(schema).writeValues(writer).writeAll(listOfMap);
    writer.flush();
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ett 4

由于您的问题是询问如何使用 Super CSV 来做到这一点,我想我应该插话(作为该项目的维护者)。

CsvBeanWriter我最初认为您可以使用的名称映射数组来迭代映射的条目集"key", "value",但这不起作用,因为HashMap的内部实现不允许反射来获取键/值。

所以你唯一的选择是使用CsvListWriter如下。至少这样你就不必担心转义 CSV(这里的所有其他示例都只是用逗号连接...aaarrggh!):

@Test
public void writeHashMapToCsv() throws Exception {
    Map<String, String> map = new HashMap<>();
    map.put("abc", "aabbcc");
    map.put("def", "ddeeff");

    StringWriter output = new StringWriter();
    try (ICsvListWriter listWriter = new CsvListWriter(output, 
         CsvPreference.STANDARD_PREFERENCE)){
        for (Map.Entry<String, String> entry : map.entrySet()){
            listWriter.write(entry.getKey(), entry.getValue());
        }
    }

    System.out.println(output);
}
Run Code Online (Sandbox Code Playgroud)

输出:

abc,aabbcc
def,ddeeff
Run Code Online (Sandbox Code Playgroud)