繁体   English   中英

Apache CSV-转换列表 <String> 到CSVRecord

[英]Apache CSV - Convert List<String> to CSVRecord

我倾向于使用CSVRecord,因为它可用于与标头映射并获取相应的值。 我的应用程序经常使用CSVRecord类。 但是,我无法实例化CSVRecord。 我希望不要修改源代码/创建新类,因为它已经提供了返回CSVRecord的解析器。 我有一个需要转换为CSVRecord类型的字符串列表(标题和值)。 有没有一种直接的方法可以做到这一点而无需进行格式化然后再解析回来? 像下面的一个:

private CSVRecord format(List<String> header, List<String> values)
{
    CSVFormat csvFormat = CSVFormat.DEFAULT.withRecordSeparator(System.lineSeparator())
            .withQuoteMode(QuoteMode.ALL);
    CSVRecord csvRecord = null;
    final StringWriter out = new StringWriter();
    try (CSVPrinter csvPrinter = new CSVPrinter(out, csvFormat);)
    {
        csvPrinter.printRecord(values);
        String value = out.toString().trim();
        for (CSVRecord r : CSVParser.parse(value, csvFormat.withHeader(header.toArray(new String[header.size()]))))
            csvRecord = r;
    }
    catch (IOException e)
    {
        logger.error("Unable to format the Iterable to CSVRecord. Header: [{}]; Values: [{}]", e,
                String.join(", ", header), String.join(", ", values));
    }
    return csvRecord;
}

private void testMethod() throws Exception
{
    List<String> header = Arrays.asList("header1", "header2", "header3");
    List<String> record = Arrays.asList("val1", "val2", "val3");
    CSVRecord csvRecord = format(header, record);
    logger.info("{}", csvRecord.get("header2"));
}

您可以将列表作为字符串直接传递到CSVParser中,而无需创建编写器。

CSVRecord csvr = CSVParser.parse(
values.stream().collect(Collectors.joining(","))
,csvFormat.withHeader(header.toArray(new String[header.size()])))
.getRecords().get(0);

BeanIO和SimpleFlatMapper更好地解决了这个问题。 BeanIO使用Map数据结构和配置文件来声明CSV文件的结构,因此它非常强大。 默认情况下,SimpleFlatMapper会将POJO属性作为标题名称,并输出该属性值为列值。

BeanIO

http://beanio.org/2.1/docs/reference/index.html#CSVStreamFormat

SimpleFlatMapper

http://simpleflatmapper.org/

CsvParser
   .mapTo(MyObject.class)
   .stream(reader)
   .forEach(System.out::println);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM