当前位置: 首页 > 知识库问答 >
问题:

Spring批处理FlatFileItemWriter-写入后在csv中显示指数值

谷出野
2023-03-14

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

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

下面是我正在使用的代码片段

// 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;
}

共有1个答案

饶德元
2023-03-14

当使用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()) };
  }
}
 类似资料:
  • 我的FlatFileItemWriter回调有一个奇怪的问题。我有一个自定义ItemWriter实现FlatFileFolterCallback和FlatFileHeaderCallback。因此,我在我的FlatFileItemWriter中设置页眉和页脚回调如下: ItemWriter Bean FlatFileItemWriter Bean 步进豆 我的writeFooter、writeHe

  • 在Spring批处理作业中,我将项目写入目标文件(使用FlatFileItemWriter),并将输入记录“process indicator”字段更新为“processed”/“failed”(使用JdbcBatchItemWriter)。在“物品交易”中实现这一点的最佳方式是什么? 使用CompositeItemWriter(委托FlatFileItemWriter写入文件,委托JdbcBat

  • 我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?

  • 我有一个包含Reader->Processor->Writer的spring批处理。 B/W传递的数据类型为: 在中从CSV文件读取一个简单的批处理数据时,中的一些处理&输出CSV文件由编写。 请建议。如果你认为任何其他方法会更好,请建议。 谢谢

  • 所以,我使用FlatFileItemWriter从数据库中成功读取的数据中编写csv文件。 我正在努力编写一个整数(即行计数器)对应于我正在写入文件的行。似乎是一件容易的事情,但很简单,我被难住了。 一切正常(从数据库读取的数据生成文件)。但我似乎不知道如何实现getCount()方法,从而获得相应行的计数。我认为这与利用ChunkContext有关,但我似乎无法理解。 因此,在我的作业配置中,我

  • 我刚开始使用Spring批处理,我有一个特殊问题。我希望使用从3个不同的jpa查询中获取结果,并分别处理它们,然后使用将它们写入一个统一的XML文件。 对于eg,生成的XML看起来像是,