我倾向于使用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"));
}
答案 0 :(得分:2)
您可以将列表作为字符串直接传递给CSVParser,而不是创建编写器。
CSVRecord csvr = CSVParser.parse(
values.stream().collect(Collectors.joining(","))
,csvFormat.withHeader(header.toArray(new String[header.size()])))
.getRecords().get(0);
答案 1 :(得分:1)
BeanIO和SimpleFlatMapper更好地解决了这个问题。 BeanIO使用Map数据结构和配置文件来声明CSV文件的结构,以便它非常强大。 SimpleFlatMapper默认将POJO属性作为标题名称,输出属性值为列值。
<强> BeanIO 强>
http://beanio.org/2.1/docs/reference/index.html#CSVStreamFormat
<强> SimpleFlatMapper 强>
CsvParser
.mapTo(MyObject.class)
.stream(reader)
.forEach(System.out::println);