gpt4 book ai didi

java - 如何创建通用的 FlatFileItemReader 来读取具有不同标题的 CSV 文件?

转载 作者:行者123 更新时间:2023-12-01 19:06:19 27 4
gpt4 key购买 nike

我正在创建一个作业,该作业将根据输入参数读取和处理不同的 .csv 文件。有 3 种不同类型的 .csv 文件,它们具有不同的 header 。我想使用通用 FlatFileItemReader 将文件的每一行映射到 POJO。

每种类型的文件都有自己的 POJO 实现,并且所有“文件特定 POJO”都是抽象 GenericFilePOJO 的子类。

tasklet首先会读取输入参数来决定需要读取哪种文件类型,并构造一个具有适当标题列的LineTokenizer。它将这些信息放置在 infoHolder 中,以便在阅读器步骤中检索。

@Bean
public FlatFileItemReader<GenericFilePOJO> reader() {
FlatFileItemReader<RawFile> reader = new FlatFileItemReader<GenericFilePOJO>();
reader.setLinesToSkip(1); // header

reader.setLineMapper(new DefaultLineMapper() {
{
// The infoHolder will contain the file-specific LineTokenizer
setLineTokenizer(infoHolder.getLineTokenizer());
setFieldSetMapper(new BeanWrapperFieldSetMapper<GenericFilePOJO>() {
{
setTargetType(GenericFilePOJO.class);
}
});
}
});
return reader;
}

尽管返回了 GenericFilePOJO,但该读取器能否处理不同的文件特定 POJO?

最佳答案

你写道:

A tasklet will first read the input parameter to decide which file type needs to be read.

由于 taskletinfoHolder 了解文件类型,因此您可以实现特定 FieldSetMapper 实例的创建。

这是一个如何实现的演示示例:

public class Solution<T extends GenericFilePOJO> {
private InfoHolder infoHolder = new InfoHolder();

@Bean
public FlatFileItemReader<T> reader()
{
FlatFileItemReader<T> reader = new FlatFileItemReader<T>();
reader.setLinesToSkip(1);

reader.setLineMapper(new DefaultLineMapper() {
{
setLineTokenizer(infoHolder.getLineTokenizer());
setFieldSetMapper(infoHolder.getFieldSetMapper());
}
});
return reader;
}

private class InfoHolder {
DelimitedLineTokenizer getLineTokenizer() {
return <some already existent logic>;
}

FieldSetMapper<T> getFieldSetMapper() {
if (some condition for specific file POJO 1){
return new BeanWrapperFieldSetMapper<T>() {
{
setTargetType(FileSpecificPOJO_1.class);
}
};
} else if (some condition for specific file POJO 2){
return new BeanWrapperFieldSetMapper<T>() {
{
setTargetType(FileSpecificPOJO_2.class);
}
};
}
}
}
}

关于java - 如何创建通用的 FlatFileItemReader 来读取具有不同标题的 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59548732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com