我正在阅读{type : "notificationPopup", level : "warning", message : "Something happened!"}
并创建CSV文件。
以下代码接受HashMap
并生成CSV文件。但格式化是一个问题。对于HashMap
,
HashMap
它产生
HashMap<String, Integer> hmap = new HashMap<String, Integer>();
hmap.put("Feature1", 1);
hmap.put("Feature2", 2);
预期输出(每行末尾没有逗号):
Feature2,Feature2,
2,1,Feature1,Feature1,
2,1,
格式错误
这是我使用的代码。如何解决?
Feature2,Feature1
2,1
答案 0 :(得分:4)
Java 8有String.join()
:
将密钥和值收集到列表中:
csvReport.append(String.join(",", keys));
csvReport.append(String.join(",", values));
Streams API有Collectors.joining()
,它可以提供更多帮助:
List<Entry> entries = new ArrayList<>(map.entrySet());
csvReport.append(entries.stream()
.map(e -> e.getKey())
.collect(Collectors.joining(","));
csvReport.append("\n");
csvReport.append(entries.stream()
.map(e -> e.getValue())
.collect(Collectors.joining(","));
csvReport.append("\n");
这两者最终都使用StringJoiner
。如果您对如何在最后没有分隔符的情况下构建连接字符串有学术兴趣,那么值得查看the code for StringJoiner
以获得一个优雅的示例。
然而 - 编写CSV有一些细微之处,除非有理由(合法,学术)不这样做,否则使用库是个好主意。 Apache Commons CSV就是其中之一。
答案 1 :(得分:3)
如果字符串长度超过1个字符,则远程调用字符串的最后一个字符。以下是如何操作:str.substring(0, str.length() - 1);
答案 2 :(得分:3)
您的循环似乎存在问题
你需要两个独立的循环(没有内循环);
另外,为了在最后删除该逗号,您可以使用body{
direction: rtl;
}
变量进行简单检查,如下所示:)
isFirst
答案 3 :(得分:2)
你应该有一个单独的StringBuilder用于键,另一个用于值。然后,当您浏览密钥时,将它们添加到您的密钥StringBuilder中,然后获取给定的映射并获取与该密钥关联的值并将其添加到您的值StringBuilder中。
最后,您只需跟踪到目前为止您看到的密钥数量。如果看到的键数不等于地图的大小,则附加逗号。但是如果你根据numOfKeys计数器在最后一个元素上,那么你就不会在StringBuilders的末尾添加任何内容。
StringBuilder csvKeyReport = new StringBuilder();
StringBuilder csvValueReport = new StringBuilder();
Map<String, Integer> map = hmap;
Set<String> keys = map.keySet();
int numOfKeys = 0;
for(String key : keys)
{
numOfKeys++;
String comma = numOfKeys == map.size() ? "" : ",";
csvKeyReport.append(key + comma);
csvValueReport.append(map.get(key) + comma);
}
csvKeyReport.append("\n");
csvKeyReport.append(csvValueReport.toString() + "\n");
System.out.print(csvKeyReport.toString());
输出
Feature2,Feature1
2,1
答案 4 :(得分:1)
实现这一目标的一种方法是做这样的事情:
import java.io.IOException;
import java.util.HashMap;
public class HashMapToCSV {
public static void main(String[] args) {
HashMap<String, Integer> hmap = new HashMap<String, Integer>();
hmap.put("Feature1", 1);
hmap.put("Feature2", 2);
try {
System.out.println(appendCSV(hmap));
} catch (IOException e){
e.printStackTrace();
}
}
public static String appendCSV(HashMap<String,Integer> featureset) throws IOException{
StringBuilder csvReport = new StringBuilder();
// loop through the keySet and append the keys
for(String key: featureset.keySet()){
csvReport.append(key+",");
}
// to remove the comma at the end
csvReport.replace(csvReport.length()-1, csvReport.length(), "");
csvReport.append("\n"); // append new line
// then loop through the keySet and append the values
for(String key: featureset.keySet()){
csvReport.append(featureset.get(key)+",");
}
csvReport.replace(csvReport.length()-1, csvReport.length(), "");
return csvReport.toString();
}
}
<强>输出强>
Feature2,Feature1
2,1
答案 5 :(得分:1)
你应该在循环中创建一个新的stringbuilder:
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class NewClass {
public NewClass() throws IOException {
HashMap<String, Integer> hmap = new HashMap<String, Integer>();
hmap.put("Feature1", 1);
hmap.put("Feature2", 2);
System.out.print(appendCSV(hmap));
}
public String appendCSV(Map featureset) throws IOException {
StringBuilder csvReport = new StringBuilder();
StringBuilder csvReportVal = new StringBuilder();
Set<String> keys = featureset.keySet();
for (String elements : keys) {
csvReport.append(elements + ",");
csvReportVal.append(featureset.get(elements).toString() + ",");
}
// Excluding the latest ","
csvReport.setLength(csvReport.length() - 1);
csvReportVal.setLength(csvReportVal.length() - 1);
csvReport.append("\n" + csvReportVal.toString());
return csvReport.toString();
}
public static void main(String[] args) throws IOException {
new NewClass();
}
}
<强>输出:强>
Feature2,Feature1
2,1