Spring boot Spring启动Spring批处理MultiResourceItemReader以合并文件

Spring boot Spring启动Spring批处理MultiResourceItemReader以合并文件,spring-boot,spring-batch,Spring Boot,Spring Batch,我试图遵循简单的方法,但在创建Person对象时,我希望读取两个文件,而不是单个文件 我已经浏览了一些示例,我看到的所有使用两个或多个文件的示例都明确使用了多个采用相同格式的文件。在我的例子中,我有两个文件,一个是firstname.csv,另一个是lastname.csv。我想通过阅读他们(最好是一步一步)来创建我的人 因此,示例显示: @Bean public ItemReader<Person> reader() { FlatFileItemRe

我试图遵循简单的方法,但在创建
Person
对象时,我希望读取两个文件,而不是单个文件

我已经浏览了一些示例,我看到的所有使用两个或多个文件的示例都明确使用了多个采用相同格式的文件。在我的例子中,我有两个文件,一个是
firstname.csv
,另一个是
lastname.csv
。我想通过阅读他们(最好是一步一步)来创建我的

因此,示例显示:

    @Bean
    public ItemReader<Person> reader() {
        FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
        reader.setResource(new ClassPathResource("sample-data.csv"));
        reader.setLineMapper(new DefaultLineMapper<Person>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "firstName", "lastName" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }});
        }});
        return reader;
    }
@Bean
公共项目阅读器(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新类路径资源(“sample data.csv”);
reader.setLineMapper(新的DefaultLineMapper(){{
setLineTokenizer(新的DelimitedLineTokenizer(){{
setNames(新字符串[]{“firstName”,“lastName”});
}});
setFieldSetMapper(新的BeanRapperFieldSetMapper(){{
setTargetType(Person.class);
}});
}});
返回读取器;
}
到目前为止,我得到的是:

  @Bean
  public ItemReader<Person> reader() {
    MultiResourceItemReader<Person> multiResourceItemReader = new MultiResourceItemReader<Person>();
    ClassPathResource[] resources = {new ClassPathResource("firstnames.csv"), new ClassPathResource("lastnames.csv")};
    multiResourceItemReader.setResources(resources);

    // Magic here ...

    return multiResourceItemReader;
  }
@Bean
公共项目阅读器(){
MultiResourceItemReader MultiResourceItemReader=新的MultiResourceItemReader();
ClassPathResource[]资源={new ClassPathResource(“firstnames.csv”)、new ClassPathResource(“lastnames.csv”)};
multiResourceItemReader.setResources(资源);
//这里有魔力。。。
返回multiResourceItemReader;
}

如何像我所描述的那样合并这些文件,而不是以相同格式合并预期的所有文件?

这可以通过读取Item processor中的第二个文件来完成-

您的-reader类型为-firtsNameReader

您的-Processor是-firstnamereder类型,它返回具有-first-name和last-name的对象

您的编写器将是object类型——将名字和姓氏写入新文件

Class ItemProcessor


public static int readLines=0;

Public void process(firstName){

String lastName;

ItemProcessor.readLines++;

FileInputStream fs= new FileInputStream("lastName.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < readLines.readLines; ++i){
  br.readLine();
  }
 lastName = br.readLine();



 System.out.println (firstName);
  System.out.println (lastName);

  NewObject obj = new NewObject();

  obj.setLastName(lastName);
  obj.setFirstName(firstName);

  return obj;

  }
类项目处理器
公共静态int readLines=0;
公共作废流程(名字){
字符串lastName;
readLines++;
FileInputStream fs=新的FileInputStream(“lastName.csv”);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fs));
对于(int i=0;i
我假设文件包含相同数量的行,对于两个文件中的第N行,数据是针对同一个人的

首先创建两个
ItemReader
s,一个用于名字,另一个用于姓氏。然后将两个条目读取器的结果合并在一起

像这样:

public ItemReader<Person> getPersonReader {
    final ItemReader<Person> firstNameReader = firstNameReader();
    final ItemReader<Person> lastNameReader = lastNameReader();

    return new ItemReader<Person>(){ 
        public Person read() {
            return mergeFirstLast(firstNameReader.read(), lastNameReader.read());
        }
    };

}

public Person mergeFirstLast(Person first, Person last) {
    // do merge logic here
    return ...
}

public ItemReader<Person> firstNameReader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
    reader.setResource(new ClassPathResource("firstname.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "firstName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    return reader;
}
public ItemReader<Person> lastNameReader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
    reader.setResource(new ClassPathResource("lastname.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "lastName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    return reader;
}
publicItemReader getPersonReader{
final ItemReader firstNameReader=firstNameReader();
final ItemReader lastNameReader=lastNameReader();
返回新的ItemReader(){
公众人士阅读{
返回mergeFirstLast(firstNameReader.read(),lastNameReader.read());
}
};
}
公众人物合并第一个最后一个(人物第一,人物最后){
//在这里合并逻辑吗
回来
}
PublicItemReader firstNameReader(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新类路径资源(“firstname.csv”);
reader.setLineMapper(新的DefaultLineMapper(){{
setLineTokenizer(新的DelimitedLineTokenizer(){{
集合名(新字符串[]{“firstName”});
}});
setFieldSetMapper(新的BeanRapperFieldSetMapper(){{
setTargetType(Person.class);
}});
}});
返回读取器;
}
PublicItemReader lastNameReader(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新类路径资源(“lastname.csv”);
reader.setLineMapper(新的DefaultLineMapper(){{
setLineTokenizer(新的DelimitedLineTokenizer(){{
集合名(新字符串[]{“lastName”});
}});
setFieldSetMapper(新的BeanRapperFieldSetMapper(){{
setTargetType(Person.class);
}});
}});
返回读取器;
}

firstname.csv的第n行是否包含相对的第n行lastname.csv,或者数据不保证同步?只有在两个文件中都存在同步时才可能出现这种情况,例如第一个文件中的第n条记录与第二个文件中的第n条记录相匹配