Boas práticas com parse em string

13 respostas
andre_a_s

Bom dia senhores :slight_smile:
Estou desenvolvendo uma aplicação que recebe os dados em um arquivo texto separado por ponto-e-virgula. Tipo um CSV.
Tenho que pegar essa string, quebrar e jogar os dados no meu bean.
Estou usando java 1.4, fiz algo desse tipo:

String line = "sadasdasd;sdadas;dasdasd;asdasdas;dasdasdas;dasd;"; String fields[] = line.split(";"); for (int i = 0; i < fields.length; i++) { bean.setNome(fields[0]); bean.setEndereco(fields[1]); //e por ai vai. }

O problema é que é muito braçal a rotina de setar os valores no bean.
Pergunto:
O que poderia fazer para contornar isso? Se não me engano, em C#.net dá pra fazer via anotations um esquema que você mapeia o token com uma propriedade.
Alguem que já trabalhou com integrações em mainframe já deve ter passado por isso.
Existe alguma maneira de automatizar isso?

Obrigado 8)

13 Respostas

T

Bom, se você não tiver problemas de desempenho, pode tentar usar o BeanUtils para acessar os campos por nome via reflection, e você poderia especificar em um arquivo (properties?) a sequência dos campos. Talvez como:

br.com.suaEmpresa.SeuBean=nome;endereco;telefone;cpf;;residencia

para indicar que na hora de preencher os dados, nome = fields[0], … cpf = fields[3], residencia = fields[5] (note que pulei um field de propósito para indicar que ele não é usado).

Ou então gerar código (a partir desse mesmo arquivo properties), o que não dá problemas de desempenho mas sim de manutenção (a menos que você tenha um script ANT bom para compilar seu código).

Mas acho que isso é o menor dos seus problemas.

andre_a_s

Boa thingol… gostei da idéia de reflection e do properties.
Acho que vai funcionar bem, mas ainda tem uma coisinha.
Tem campos que devem ser tratados.
Por exemplo:

veiculo.setDataFormalizacao(new SimpleDateFormat("dd/MM/yyyy").parse(fields[2]));

Nesse caso, acho que atrapalha um pouco a automação, certo ?

T

Com properties dá pra brincar à vontade. É só você ter paciência (daqui a pouco você vai criar um XML que é tão complicado de preencher quanto você escrever você mesmo o programa - não seja ambicioso demais.)

br.com.suaEmpresa.SeuBean=nome;endereco;telefone;cpf;;residencia;dataFormalizacao
br.com.suaEmpresa.SeuBean-dataFormalizacao=dd/MM/yyyy

(note que # é especial em um arquivo .properties, assim como “:”, por isso usei um “-” mesmo.

rodrigoallemand

Vc pode passar a linha toda para um construtor e fazer o tratamento dentro dele, não seria uma boa ideia?

andre_a_s

É verdade… tem que tomar cuidado com a complexidade que isso vai ficar.
Mas legal thingol… muito obrigado, ajudou bastante!

T

Até aí isso é o de menos (se é em um construtor ou em um método).
Ele está reclamando é do trabalho braçal (e sujeito a erros bobos) que é desmontar a string e preencher os campos.
Eu sei bem disso, e sei que é fácil resolver isso com @Annotations (java 5.0 - se quiser fazer as coisas em tempo de execução)) ou XDoclet (1.4 ou anteriores - se quiser efetuar geração de código).

andre_a_s

Como você faria isso com Annotations ?

rodrigoallemand

thingol:
Até aí isso é o de menos (se é em um construtor ou em um método).
Ele está reclamando é do trabalho braçal (e sujeito a erros bobos) que é desmontar a string e preencher os campos.

Resta saber se este trabalho braçal é alterado constantemente ou se é totalmente estático e maduro. Acho que se ele sempre receber esta string, no mesmo formato, sem muitas alterações ao longo do sistema, existem maneiras mais faceis de fazer isso…

T

É meio chato (e um pouco pesado) porque você tem de fazer algo como:

public class SeuBean {
     @MinhaAnotacao(pos = 1) 
     public void setNome(String nome) {
     }
     @MinhaAnotacao(pos = 5, format="dd/MM/yyyy") 
     public void setDataFormalizacao(Date dataFormalizacao) {
     }
     public SeuBean (String inicializacao) {
         Util.inicializar (this, inicializacao);
     }
}

e a classe Util (o nome não é legal; escolha um nome adequado…) tem de pegar a instância que você disponibilizou para o método inicializar, a string que você pediu para efetuar o split, e procurar os métodos que têm a anotação MinhaAnotacao; para cada um desses métodos, efetuar as conversões adequadas, e chamar o tal método. É braçal (e um pouco pesado) mas dá para fazer.

andre_a_s

Interessante.
É um pocuo trabalhoso, mas acho que depois fica fácil pra dar manutenção.
Mesmo assim, obrigado pelas dicas.
Vou bolar algo e assim que estiver pronto e funcionando eu posto aqui :wink:

Marky.Vasconcelos

Só pra aproveitar o tópico falando sobre Annotations

Como eu faço que um atributo da anotação possa ser preenchido ou não.

Como as anotações do Hibernate que posso setar em @Column o name ou não.

T

Exemplo:

public @interface MinhaAnotacao {
    String format() default "dd/MM/yyyy";
}
Marky.Vasconcelos

Era isso mesmo obrigado.

Criado 25 de outubro de 2007
Ultima resposta 25 de out. de 2007
Respostas 13
Participantes 4