act*_*ner 4 java csv hashmap supercsv
我有一个带有String键和String值的hashmap.它包含大量的键及其各自的值.
例如:
key | value
abc | aabbcc
def | ddeeff
Run Code Online (Sandbox Code Playgroud)
我想将此hashmap写入csv文件,以便我的csv文件包含如下行:
abc,aabbcc
def,ddeeff
Run Code Online (Sandbox Code Playgroud)
我在这里使用supercsv库尝试了以下示例:http://javafascination.blogspot.com/2009/07/csv-write-using-java.html .但是,在此示例中,您必须为要添加到csv文件的每一行创建一个hashmap.我有大量的键值对,这意味着需要创建几个哈希映射,每个哈希映射包含一行的数据.我想知道是否有更优化的方法可用于此用例.
提前致谢!
这样的事情应该可以解决问题:
String eol = System.getProperty("line.separator");
try (Writer writer = new FileWriter("somefile.csv")) {
for (Map.Entry<String, String> entry : myHashMap.entrySet()) {
writer.append(entry.getKey())
.append(',')
.append(entry.getValue())
.append(eol);
}
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
Run Code Online (Sandbox Code Playgroud)
使用Jackson API,Map或Map of List可以用CSV文件编写.请在此处查看完整示例
/**
* @param listOfMap
* @param writer
* @throws IOException
*/
public static void csvWriter(List<HashMap<String, String>> listOfMap, Writer writer) throws IOException {
CsvSchema schema = null;
CsvSchema.Builder schemaBuilder = CsvSchema.builder();
if (listOfMap != null && !listOfMap.isEmpty()) {
for (String col : listOfMap.get(0).keySet()) {
schemaBuilder.addColumn(col);
}
schema = schemaBuilder.build().withLineSeparator(System.lineSeparator()).withHeader();
}
CsvMapper mapper = new CsvMapper();
mapper.writer(schema).writeValues(writer).writeAll(listOfMap);
writer.flush();
}
Run Code Online (Sandbox Code Playgroud)
由于您的问题是询问如何使用 Super CSV 来做到这一点,我想我应该插话(作为该项目的维护者)。
CsvBeanWriter我最初认为您可以使用的名称映射数组来迭代映射的条目集"key", "value",但这不起作用,因为HashMap的内部实现不允许反射来获取键/值。
所以你唯一的选择是使用CsvListWriter如下。至少这样你就不必担心转义 CSV(这里的所有其他示例都只是用逗号连接...aaarrggh!):
@Test
public void writeHashMapToCsv() throws Exception {
Map<String, String> map = new HashMap<>();
map.put("abc", "aabbcc");
map.put("def", "ddeeff");
StringWriter output = new StringWriter();
try (ICsvListWriter listWriter = new CsvListWriter(output,
CsvPreference.STANDARD_PREFERENCE)){
for (Map.Entry<String, String> entry : map.entrySet()){
listWriter.write(entry.getKey(), entry.getValue());
}
}
System.out.println(output);
}
Run Code Online (Sandbox Code Playgroud)
输出:
abc,aabbcc
def,ddeeff
Run Code Online (Sandbox Code Playgroud)