繁体   English   中英

如何将地图列表转换为 CSV

[英]How to convert List of Maps to CSV

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

List<Map<String,Object>> maps = new ArrayList<Map<String,Object>>();

地图对象包含以下格式的值

地图1:

(header 1, value1)

(header 2, value2)

(header 3, value3)

(header 4, value4)

地图2:

(header 1, value5)

(header 2, value6)

(header 3, value7)

(header 4, value8)

我正在寻找如下所示的 CSV

header1, header2,header3, header4

value1, value2,value3,value4

value5,value6,value7,value8

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

标题 1,值 1

标头2,值2

标题 3,值 3

标头 4,值 4

标头 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"); } } 

下面的代码会帮助你。 它还没有为您的目的做好准备。 您需要更改它,以便它打印到文件而不是返回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();
}

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

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));
}

在此处输入图片说明

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

另一个示例,当其中一个映射中不存在密钥时:

在此处输入图片说明

以下代码解决了您的问题:

import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;

public class SomeMaps {

    public static void main(String[] args) {
        Map<String, String> firstMap = new HashMap<>();
        Map<String, String> secondMap = new HashMap<>();

        firstMap.put("header 1", "value1");
        firstMap.put("header 2", "value2");
        firstMap.put("header 3", "value3");
        firstMap.put("header 4", "value4");

        secondMap.put("header 1", "value5");
        secondMap.put("header 2", "value6");
        secondMap.put("header 3", "value7");
        secondMap.put("header 4", "value8");

        List<Map<String, String>> maps = new ArrayList<>();
        maps.add(firstMap);
        maps.add(secondMap);

        // extract all headers
        SortedSet<String> keys = new TreeSet<>(firstMap.keySet());
        for(Map<String, String> map : maps){
            keys.addAll(map.keySet());
        }


        String header = StringUtils.join(keys, ",");
        System.out.println(header);

        // generate content of CSV file
        for(Map<String, String> map : maps){
            String line = getLineFromMap(map, keys);
            System.out.println(line);
        }
    }

    private static String getLineFromMap(Map<String, String> someMap, SortedSet<String> keys) {
        List<String> values = new ArrayList<>();
        for (String key : keys) {
            values.add(someMap.get(key) == null ? " " : someMap.get(key));
        }
        return StringUtils.join(values, ",");
    }
}

考虑以下列表

[
{
"header1": "value1",
"header2": "value2",
"header3": "value3",
"header4": "value4"
},
{
"header1": "value1",
"header2": "value2",
"header3": "value3",
"header4": "value4"
},
{
"header1": "value1",
"header2": "value2",
"header3": "value3",
"header4": "value4"
}
]

为了将其转换为 CSV 文件,我添加了一个简单的方法....

public String createCSV(List<LinkedHashMap<String, String>> list) throws IOException{
    List<String> headers = list.stream().flatMap(map -> map.keySet().stream()).distinct().collect(Collectors.toList());

    String path= "dataCSV.csv";

    try(FileWriter writer= new FileWriter(path, true);){
           for (String string : headers) {
                 writer.write(string);
                 writer.write(",");
           }
           writer.write("\r\n");

           for (LinkedHashMap<String, String> lmap : list) {
                 for (Entry<String, String> string2 : lmap.entrySet()) {
                        writer.write(string2.getValue());
                        writer.write(",");
                 }
                 writer.write("\r\n");
           }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return "File created"}

该文件将被创建,它应该包含 List 中的以下条目

       header1  header2 header3 header4
        value1  value1  value1  value1
        value2  value2  value2  value2
        value3  value3  value3  value3
        value4  value4  value4  value4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM