【问题标题】:Spring batch FlatFileItemWriter - Showing exponential value in csv after writing itSpring batch FlatFileItemWriter - 写入后在csv中显示指数值
【发布时间】:2021-04-02 15:48:52
【问题描述】:

我有一个 Spring 批处理应用程序,它从 mysql 数据库中读取数据并将其写入 csv 文件。

问题: 当我看到 csv 中的数据时,我面临的问题是一些大数字显示为指数值。例如对于这个数字 '4491611100277480',它显示为 '4.49161E+15"

下面是我正在使用的代码 sn-p

// Job
@Bean
public Job databaseToCsvJob() {
    return jobBuilderFactory.get("databaseToCsvJob").incrementer(new RunIdIncrementer())
            // .listener(listener)
            .start(databaseToCsvJob_step()).build();
}

// Step
@Bean
public Step databaseToCsvJob_step() {
    return stepBuilderFactory.get("databaseToCsvJob_step").<Person, Person>chunk(1000).reader(personReader())
            .writer(personWriter()).build();
}

// Reader
@Bean
public JdbcCursorItemReader<Person> personReader() {
    JdbcCursorItemReader<Person> reader = new JdbcCursorItemReader<>();
    reader.setSql("select empCode , empName , profileName, ID from profile");
    reader.setDataSource(mysqlDataSource);
    reader.setRowMapper(personRowmapper());
    return reader;
}

// Writer
@Bean
public FlatFileItemWriter<Person> personWriter() {
    // Create writer instance
    FlatFileItemWriter<Person> writer = new FlatFileItemWriter<>();

    // Set output file location
    writer.setResource(new FileSystemResource("src/main/resources/people-data.csv"));

    // All job repetitions should "append" to same output file
    writer.setAppendAllowed(true);

    // Name field values sequence based on object properties
    writer.setLineAggregator(new DelimitedLineAggregator<Person>() {
        {
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<Person>() {
                {
                    setNames(new String[] { "empCode", "empName", "profileName", "id" });
                }
            });
        }
    });
    return writer;
}

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    当您使用 double 作为数据类型时会发生这种情况。将其更改为 long,它应该可以正常工作。

    如果由于某种原因它必须保持双倍,您可以在提取期间转换该值:

    new BeanWrapperFieldExtractor<Person>() {
      {
        setNames(new String[] { "empCode", "empName", "profileName", "id" });
      }
      public Object[] extract(Person person) {
        return new Object[] { person.getEmpCode(), person.getEmpName(), person.getProfileName(), ((long) person.getId()) };
      }
    }
    

    【讨论】:

    • 同意这个答案。您也可以使用相同的方法转换为字符串并进行各种格式化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多