微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Univocity Parser 中将 ResultSet 格式化为特定的 DecimalFormat

如何解决在 Univocity Parser 中将 ResultSet 格式化为特定的 DecimalFormat

在我的项目中,我一直使用 univocity-parserssql 查询转换为 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?