[英]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.