【问题标题】:Spring-Boot Spring-Batch MultiResourceItemReader to merge filesSpring-Boot Spring-Batch MultiResourceItemReader 合并文件
【发布时间】:2015-10-27 12:30:24
【问题描述】:

我正在尝试遵循简单的Spring Batch tutorial,但我想在创建Person 对象时读取两个文件而不是单个文件。

我一直在查看示例,并且我看到的所有使用两个或多个文件的示例都明确使用遵循相同格式的多个文件。就我而言,我有两个文件,一个firstname.csv 和一个lastname.csv。我想从他们那里阅读(最好是一步)来创建我的Person

所以例子显示:

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

如何按照我的描述合并这些文件,而不是按照预期的格式合并所有文件?

【问题讨论】:

  • firstname.csv的第n行是否包含相对的第n行lastname.csv或数据不保证同步?
  • 这只有在两个文件都同步的情况下才有可能——比如第一个文件中的第 n 条记录与第二个文件中的第 n 条记录匹配

标签: spring-boot spring-batch


【解决方案1】:

我假设文件包含相同数量的行,并且对于两个文件中的第 N 行,数据是针对同一个人的。

首先创建两个ItemReaders,一个用于名字,另一个用于姓氏。然后将两个item reader的结果合并在一起。

像这样:

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

【讨论】:

    【解决方案2】:

    这可以通过读取项目处理器中的第二个文件来完成 -

    你的 -reader 是类型 - firtsNameReader

    您的 -Processor 类型为 - firstNameReader,它返回具有 - 名字和姓氏的对象

    您的作者将是对象类型 -- 将名字和姓氏写入新文件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      相关资源
      最近更新 更多