Sep.04

Como ler um arquivo CSV com Spring Batch?

Estava fazendo uns testes utilizando um arquivo CSV, como fazer sua leitura para posteriormente gravar os dados em uma base de dados.

Bom, é bem simples de se fazer e utilizei como referência a propria documentação do Spring Batch e o livro Spring Batch in Action. 

———

Neste exemplo utilizarei um arquivo csv chamado: pessoas.csv que conterá objetos pessoa possuindo id, nome e idade;

 Arquivo CSV

id,nome,idade

1,Monica,19

2,Joao,30

3,Juliana,20

4,Sandra,23

5,Jose,10

Para efetuarmos a leitura de um arquivo CSV (Comma Separated Values) podemos utilizar uma implementação bem tranquila do Spring que abstrai e facilita o nosso trabalho, vamos utilizar a classe: FlatFileItemReader.

No entanto o FlatFileItemReader necessita de dois parâmetros para o funcionamento, que é uma classe de Domínio (Bean) referente ao arquivo (É aquela classe que possui os atributos, getters, setters e etc)  e alguem que implemente a interface LineMapper.

Com relação ao LineMapper o Spring já nos fornece uma implementação, a classe DefaultLineMapper.

A Classe DefaultLineMapper precisa ter duas propriedades para o seu funcionamento, que é uma classe que implemente LineTokenizer (responsável por pegar os elementos e separar os seus atributos) e uma implementação de FieldSetMapper que será  a classe responsável por fazer o “MOR” (mapeamento objeto relacional) do arquivo na classe de domínio Java.

Com relação ao LineTokenizer podemos usar uma implementação já existente do Spring que é a classe DelimitedLineTokenizer onde só precisamos especificar a propriedade “names” que corresponde aos atributos do arquivo csv.  Já quando falamos do FieldSetMapper precisamos cria-lo e customiza-lo para a nossa aplicação como no exemplo da classe PessoaFieldSetMapper.java abaixo:


import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;

import br.eti.hussamaismail.batch.poc.csv.domain.Pessoa;

public class PessoaFieldSetMapper implements FieldSetMapper<Pessoa> {

public Pessoa mapFieldSet(FieldSet arg) {

Pessoa p = new Pessoa();

p.setId(arg.readInt("id"));
p.setNome(arg.readString("nome"));
p.setIdade(arg.readInt("idade"));

return p;
}

}

 

Pronto, feito isso já conseguiriamos ler um arquivo CSV no entanto um STEP é composto de um Reader e um Writer, como só temos um reader precisamos implementar um writer para nosso projeto.

Para implementar um writer é bem simples basta criar uma classe que implemente a interface ItemWriter seguindo o exemplo:


public class Writer implements ItemWriter<Pessoa> {

public void write(List<? extends Pessoa> arg0) throws Exception {
System.out.println(arg0.toString());
}

}

Arquivo do Job

<bean id=”reader” class=”org.springframework.batch.item.file.FlatFileItemReader”>
   <property name=”resource”>
     <bean class=”org.springframework.core.io.FileSystemResource”>
         <constructor-arg value=”src/main/resources/csvs/pessoas.csv“/>
     </bean>
   </property>
   <property name=”lineMapper” ref=”defaultLineMapper”/>
   <property name=”linesToSkip” value=”1″/>
</bean>

<bean id=”defaultLineMapper” class=”org.springframework.batch.item.file.mapping.DefaultLineMapper”>
   <property name=”lineTokenizer”>
      <bean class=”org.springframework.batch.item.file.transform.DelimitedLineTokenizer”>
        <property name=”names” value=”id,nome,idade”/>
      </bean>
   </property>
   <property name=”fieldSetMapper”>
     <bean class=”br.eti.hussamaismail.batch.poc.csv.mapper.PessoaFieldSetMapper”/>
   </property>
</bean>

<bean id=”writer” class=”br.eti.hussamaismail.batch.poc.csv.other.Writer”></bean>

<batch:job id=”readCsvJob” job-repository=”jobRepository”>
   <batch:step id=”step1″>
      <batch:tasklet>
         <batch:chunk reader=”reader” writer=”writer” commit-interval=”1″></batch:chunk>
      </batch:tasklet>
   </batch:step>
</batch:job>

PS: atributo commit-interval refere-se a quantidade de itens que serão processados antes que a transação seja comitada.

Bom, é isso pessoal com isso temos um exemplo de como fazer a leitura de um arquivo CSV de maneira bem simples

Abração.

Spring Batch
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(1)

  1. erick
    2108 days ago

    como eu faço para rodar um teste desse exemplo? e esse <batch:job eu coloco onde?

Leave a comment

Comment