Java 如何将地图列表转换为CSV
我需要将地图列表转换为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
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