如何解决在 Univocity Parser 中将 ResultSet 格式化为特定的 DecimalFormat
在我的项目中,我一直使用 univocity-parsers
将 sql 查询转换为 CSV 文件。
它曾经首先将查询映射到 Java Beans
,然后使用 CsvRoutines
编写 CSV。
public static class Bean {
@Parsed(field = "double_value")
public Double doubleValue;
public Bean(Double doubleValue) {
this.doubleValue = doubleValue;
}
}
@Test
public void writetoCsv() {
List<Bean> beans = List.of(new Bean(10.0),new Bean(50.5),new Bean(12.0));
CsvRoutines csvRoutines = new CsvRoutines();
StringWriter stringWriter = new StringWriter();
csvRoutines.writeall(beans,Bean.class,stringWriter);
System.out.println(stringWriter);
}
结果如下:
10.0
50.5
12.0
现在我正在重构一种更通用的方法,将 ResultSet
直接转储到 CsvRoutines
。
和上面的例子类似,我在 Postgres 中做了一个小表:
create table bean(
double_value numeric
);
insert into bean values (10),(50.5),(12);
@Test
public void writetoCsv() throws sqlException {
Connection c = createJdbcConnection();
PreparedStatement stmt = c.prepareStatement("select double_value from bean");
ResultSet rs = stmt.executeQuery();
CsvRoutines csvRoutines = createCsvRoutines();
StringWriter stringWriter = new StringWriter();
csvRoutines.write(rs,stringWriter);
System.out.println(stringWriter);
}
现在,结果并不总是包含十进制数。
10
50.5
12
出于兼容性原因,我希望它产生与初始版本完全相同的输出。
我已尝试配置自定义 ObjectRowWriterProcessor
,但它的格式似乎不正确。
private CsvRoutines createCsvRoutines() {
CsvWriterSettings writerSettings = new CsvWriterSettings();
ObjectRowWriterProcessor rowProcessor = new ObjectRowWriterProcessor();
rowProcessor.convertType(Double.class,Conversions.formatToNumber("0.0"));
writerSettings.setRowWriterProcessor(rowProcessor);
return new CsvRoutines(writerSettings);
}
如何将 CsvRoutines
配置为始终像最初那样以 0.0
格式写入?
解决方法
看起来 ObjectRowWriterProcessor
方法工作正常,但运行时的类型是 BigDecimal
而不是 Double
。
因此更改以下行确实会产生所需的结果:
rowProcessor.convertType(BigDecimal.class,Conversions.formatToNumber("0.0"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。