2015-08-04 4 views
0

Я пытаюсь выполнить простой Spring Batch tutorial, но я хочу читать два файла вместо одного файла при создании объекта Person.Spring-Boot Spring-Batch MultiResourceItemReader для объединения файлов

Я просматривал примеры, и все примеры, которые я видел, которые используют два или более файла, явно используют несколько файлов, которые соответствуют одному и тому же формату. В моем случае у меня есть два файла: 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; 
    } 

Как объединить эти файлы, как я описал, вместо ожидаемого все файлы с одинаковым способом?

+0

ли п-й строке firstname.csv содержит относительный п-й lastname.csv или данные не гарантируют быть синхронизированы? –

+0

это возможно, только если есть синхронизация в обоих файлах - например, n-я запись в первом файле соответствует n-й записи в файле seconn –

ответ

-1

это можно сделать, прочитав второй файл в Item процессоре -

Ваш ридер имеет типа - firtsNameReader

Ваш -Процессор имеет типа - firstNameReader который возвращает объект, имеющий - первое имя и последний имя

Ваш автор будет объекта типа --writting имя и фамилию в новый файл

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; 

    } 
0

я предполагаю файл содержит одинаковое количество строк, а для строки 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; 
} 
Смежные вопросы