如何将地图列表转换为CSV

par*_*rng 1 java csv dictionary list

我需要将地图列表转换为CSV对象,如下所示

List<Map<String,Object>> maps = new ArrayList<Map<String,Object>>();
Run Code Online (Sandbox Code Playgroud)

maps对象包含以下格式的值

地图1:

(header 1, value1)

(header 2, value2)

(header 3, value3)

(header 4, value4)
Run Code Online (Sandbox Code Playgroud)

地图2:

(header 1, value5)

(header 2, value6)

(header 3, value7)

(header 4, value8)
Run Code Online (Sandbox Code Playgroud)

我正在寻找下面的CSV

header1, header2,header3, header4

value1, value2,value3,value4

value5,value6,value7,value8
Run Code Online (Sandbox Code Playgroud)

我试图读取地图(键,值)并写入CSV文件,但它写入格式

标题1,value1

header2,value2

标题3,value3

header4,VALUE4

头1,值5

像这样下面是我试过的代码片段

(Map<String, Object> map : maps) {

 for (Map.Entry<String, Object> entry : map.entrySet()) {

w.append(entry.getKey()).append(",").append(entry.getValue()??.toString()).append(??"\n"); } } 
Run Code Online (Sandbox Code Playgroud)

xen*_*ros 8

以下代码将为您提供帮助.它还没有为你的目的做好准备.您需要更改它,因此它会打印到文件而不是返回String.

private static String toCSV(List<Map<String, Object>> list) {
    List<String> headers = list.stream().flatMap(map -> map.keySet().stream()).distinct().collect(toList());
    final StringBuffer sb = new StringBuffer();
    for (int i = 0; i < headers.size(); i++) {
        sb.append(headers.get(i));
        sb.append(i == headers.size()-1 ? "\n" : ",");
    }
    for (Map<String, Object> map : list) {
        for (int i = 0; i < headers.size(); i++) {
            sb.append(map.get(headers.get(i)));
            sb.append(i == headers.size()-1 ? "\n" : ",");
        }
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

对于以下输入,它给出了以下输出:

public static void main(String[] args) {
    List<Map<String, Object>> list = new ArrayList<>();
    Map<String, Object> map1 = new HashMap<>();
    map1.put("header1", "value1");
    map1.put("header2", "value2");
    map1.put("header3", "value3");
    map1.put("header4", "value4");
    Map<String, Object> map2 = new HashMap<>();
    map2.put("header1", "value5");
    map2.put("header2", "value6");
    map2.put("header3", "value7");
    map2.put("header4", "value8");
    list.add(map1);
    list.add(map2);
    System.out.println(toCSV(list));
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这种形式是完全可逆的,所以你可以编写自己的方法来从这样的CSV读取到 List<Map<String, String>

另一个例子,当其中一个地图中没有关键字时:

在此输入图像描述

  • @xenteros 小更正需要它应该是“map.keySet().stream()).distinct().collect(Collectors.toList())”而不仅仅是 toList() (2认同)