Spring Batch - 以逗号分隔的值 - 保存在数据库中

时间:2017-06-06 21:01:48

标签: spring-batch

我有一个文件,其中包含以逗号(“,”)分隔的值列表(用户ID),如下所示。

111,222,333,444,555,777 ............

该文件包含数百万条此类记录,我想将这些值保存到RDBMS表中的单个列中。 我尝试使用DelimitedLineTokenizer来解析数据。

问题是“DelimitedLineTokenizer”只考虑一行中的一个条目,其余的值被忽略。第一个条目(" 111")被保存,其余的值保存在同一行中如果有第二行,则保存第二行中的第一个元素,并忽略其余部分。

有没有办法将所有逗号分隔的值从一行标记出来并将所有这些值保存到DB中?

查询是以下内容。 INSERT INTO users(id)VALUES(:userid)。

我使用以下代码解析文件并将其保存在DB中。

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();
    }

1 个答案:

答案 0 :(得分:0)

基本上,你有两个目标对象的分隔符 - 逗号&amp;新队。因此,要么编写一个可以在两个分隔符上工作的自定义阅读器,要么需要预处理文件以使其达到标准格式。

在我看来,通过预处理文件以用新行字符替换所有逗号,你会更好。

您可以按原样保留原始文件,并在新的临时文件中创建预处理数据。

您可以将其作为单独的弹簧批处理步骤(由于文件大小而不推荐),或者如果它可能是您的启动脚本中的预定作业。

Replace comma with newline in java

How to break lines at a specific character in Notepad++?

Notepad++ find and replace string with a new-line

Replace comma with new line in a text file using tr in Linux