Spring batch Spring批处理-逗号分隔值-保存在数据库中
我有一个文件,其中包含由逗号(“,”)分隔的值(用户ID)列表,如下所示 11122233344455777 该文件包含数百万条这样的记录,我想将这些值保存到RDBMS表中的一列中。 我尝试使用DelimitedLineTokenizer解析数据 问题在于,“DelimitedLineTokenizer”只考虑单行中的一个条目,其余的值将被忽略。保存第一个条目(“111”)并忽略同一行中的其余值。如果有第二行,则保存第二行中的第一个元素并忽略其余元素 有没有一种方法可以标记一行中所有逗号分隔的值,并将它们保存到DB中 下面是一个查询。 插入用户(id)值(:userid) 我使用以下代码解析文件并将其保存在DB中Spring batch Spring批处理-逗号分隔值-保存在数据库中,spring-batch,Spring Batch,我有一个文件,其中包含由逗号(“,”)分隔的值(用户ID)列表,如下所示 11122233344455777 该文件包含数百万条这样的记录,我想将这些值保存到RDBMS表中的一列中。 我尝试使用DelimitedLineTokenizer解析数据 问题在于,“DelimitedLineTokenizer”只考虑单行中的一个条目,其余的值将被忽略。保存第一个条目(“111”)并忽略同一行中的其余值。如果有第二行,则保存第二行中的第一个元素并忽略其余元素 有没有一种方法可以标记一行中所有逗号分隔的值
public FlatFileItemReader<User> reader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<User>();
DelimitedLineTokenizer reader = new DelimitedLineTokenizer(",");
reader.setNames(new String[] {“userid”});
blah…blah….blah….
reader.setLineMapper(new DefaultLineMapper<User>() {
{
setLineTokenizer(reader);
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {
{
setTargetType(User.class);
}
});
}
});
return reader;
}
@Bean
public UserItemProcessor processor() {
return new UserItemProcessor();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener) {
return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).listener(listener)
.flow(step1()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<User, User> chunk(5).reader(reader()).processor(processor())
.writer(writer()).build();
}
公共FlatFileItemReader(){
FlatFileItemReader=新的FlatFileItemReader();
DelimitedLineTokenizer读取器=新的DelimitedLineTokenizer(“,”);
setNames(新字符串[]{“userid”});
等等…等等…等等…。
reader.setLineMapper(新的DefaultLineMapper(){
{
setLineTokenizer(读卡器);
setFieldSetMapper(新的BeanRapperFieldSetMapper(){
{
setTargetType(User.class);
}
});
}
});
返回读取器;
}
@豆子
公共UserItemProcessor处理器(){
返回新的UserItemProcessor();
}
@豆子
公共作业导入器作业(作业完成通知侦听器侦听器){
返回jobBuilderFactory.get(“importUserJob”).incrementer(新的RunIdIncrementer()).listener(listener)
.flow(step1()).end().build();
}
@豆子
公共步骤第1步(){
返回stepBuilderFactory.get(“step1”).chunk(5).reader(reader()).processor(processor())
.writer(writer()).build();
}
基本上,目标对象有两个分隔符-逗号和新行。因此,您要么编写一个同时使用两个分隔符的自定义读取器,要么需要对文件进行预处理,使其成为标准格式
在我看来,您最好对文件进行预处理,用新行字符替换所有逗号
您可以原样保留原始文件,并在新的临时文件中创建预处理的数据
您可以将其作为单独的spring批处理步骤来执行(由于文件大小的原因,不建议这样做),或者如果它将是一个计划的作业,则可能在启动脚本中执行