Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将地图列表转换为CSV_Java_List_Csv_Dictionary - Fatal编程技术网

Java 如何将地图列表转换为CSV

Java 如何将地图列表转换为CSV,java,list,csv,dictionary,Java,List,Csv,Dictionary,我需要将地图列表转换为CSV对象,如下所示 List<Map<String,Object>> maps = new ArrayList<Map<String,Object>>(); header1, header2,header3, header4 value1, value2,value3,value4 value5,value6,value7,value8 地图2: (header 1, value5) (header 2, valu

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

List<Map<String,Object>> maps = new ArrayList<Map<String,Object>>();
header1, header2,header3, header4

value1, value2,value3,value4

value5,value6,value7,value8
地图2:

(header 1, value5)

(header 2, value6)

(header 3, value7)

(header 4, value8)
我正在寻找CSV,这应该像下面

List<Map<String,Object>> maps = new ArrayList<Map<String,Object>>();
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"); } } 

下面的代码将帮助您。它还没有为你的目的准备好。您需要更改它,以便它打印到文件中,而不是返回字符串

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

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读取列表以下代码将帮助您。它还没有为你的目的准备好。您需要更改它,以便它打印到文件中,而不是返回字符串

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

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读取列表以下代码解决了您的问题:

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

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

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"}

考虑以下列表

[
{
"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"}

这个解决方案你能负担多少钱?不是软件编写服务。请向我们展示您的努力,然后再次询问如何解决您无法执行的步骤我尝试读取映射键、值并写入CSV文件,但其写入格式头1、值1头2、值2头3、值3头4、值4头1、值5如下是我尝试用于映射:映射的代码片段{对于Map.Entry:Map.entrySet{w.appendentry.getKey.append、.appendentry.getValue.toString.append\n;}大多数映射都是无序的。这意味着您不能以一致的顺序迭代条目。要么使用LinkedHashMap,要么先将所有密钥标题添加到列表中,然后迭代标题列表,以一致的顺序获取密钥。您能负担多少解决方案?这不是软件编写服务。请向我们展示您的努力,然后询问关于解决您无法执行的步骤,我尝试读取映射键、值并写入CSV文件,但它写入格式头1、值1头2、值2头3、值3头4、值4头1、值5,如下所示是我尝试用于map:maps的代码片段{对于Map.Entry:Map.entrySet{w.appendentry.getKey.append、.appendentry.getValue.toString.append\n;}大多数映射都是无序的。这意味着您无法以一致的顺序迭代条目。可以使用LinkedHashMap,也可以先将所有密钥头添加到列表中,然后迭代Headerlist,以一致的顺序获取密钥。感谢您的示例代码段,但当我尝试使用toCSV方法时,无法解析strem方法是针对list.strem调用的,甚至键集也无法解析。请您对此发表评论this@user3655257streams出现在java 8中。您可以用for循环替换它,并自己构造一个不同头的列表,但最好切换到java 8,因为java 9即将到来。@Xentros需要进行一些小的更正,应该是这样的be map.keySet.stream.distinct.collectCollectors.toList不仅要感谢您的示例代码片段,而且当我尝试使用toCSV方法时,它无法解析针对list list.strem调用的strem方法,甚至无法解析的keySet。请您对此发表评论this@user3655257流出现在Java8中。您可以替换它使用for循环,并由您自己构造一个不同头的列表,但最好切换到Java 8,因为Java 9即将到来。@Xentros需要进行细微的修改它应该是map.keySet.stream.distinct.collectCollectors.toList而不仅仅是toList