Importando e Exportando Arquivos Texto em Java

| | Comentários(10) | TrackBacks (1)
text.jpgUma coisa que eu sempre gostei de trabalhar é com conversão de dados. Sempre achei desafiador pegar dados em um formato proprietário de uma aplicação e tranformá-lo em algo interessante para outra aplicação.

Durante minha carreira como Analista Desenvolvedor, já participei de diversas migrações de dados, já criei softwares para automação de conversão de interfaces, já utilizei toolkits prontos, como o Data Transformation Services do MS SQL.

Foi esta experiência que me levou a conhecer um excepcional toolkit para importar, exportar e trabalhar com arquivos texto, mais conhecidos como flat files. Trata-se do FileHelpers, escrito pelo argentino Marcos Meli. O toolkit se aproveita de annotations para descrever o arquivo e transformá-lo de texto para um objeto ou vice-versa. O grande problema, para mim, deste toolkit é que ele está escrito em C# e eu utilizo Java no meu dia-a-dia. Então veio a idéia de fazer um port desta biblioteca. Nasceu então o JFileHelpers. A idéia inicial é ter as mesmas funcionalidades do FileHelpers, em Java.

Mas chega de lero-lero, vamos às funcionalidades. Veja que interessante como fica um bean anotado pelo JFileHelpers:
@FixedLengthRecord()
public class Customer {
	@FieldFixedLength(4)
	public Integer custId;

	@FieldAlign(alignMode=AlignMode.Right)
	@FieldFixedLength(20)
	public String name;

	@FieldFixedLength(3)
	public Integer rating;

	@FieldTrim(trimMode=TrimMode.Right)
	@FieldFixedLength(10)
	@FieldConverter(converter = ConverterKind.Date, 
		format = "dd-MM-yyyy")
	public Date addedDate;
	
	@FieldFixedLength(3)
	@FieldOptional
	public String stockSimbol;	
}

Neste exemplo, estamos trabalhando com um arquivo de texto com delimitação, por exemplo:

1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF

Tudo o que é necessário fazer, para ler este arquivo seria:
FileHelperEngine<Customer> engine = 
	new FileHelperEngine<Customer>(Customer.class);	
List<Customer> customers = 
	new ArrayList<Customer>();

customers = engine.readResource(
	"/samples/customers-fixed.txt");

E voilá: você tem um um ArrayList devidamente preenchido com objetos do tipo Customers, com todas as regras que você definiu. Note que a conversão do campo addedDate foi feita de forma transparente, usando as anotações de formatação:
@FieldTrim(trimMode=TrimMode.Right)
@FieldFixedLength(10)
@FieldConverter(converter = ConverterKind.Date, 
	format = "dd-MM-yyyy")
public Date addedDate;

Além destas funcionalidades, o JFileHelpers permite que você faça o caminho inverso, ou seja, se você tem objetos anotados, ele pode fazer a persistência de forma extremamente fácil, veja no nosso exemplo:
O arquivo para este exemplo ficaria:

   2        Felipe Coury  201-01-2007   
   3      Anderson Polga 8212-11-2007APR

Isto é apenas o começo. Existem muito mais funcionalidades fantásticas no JFileHelpers (como por exemplo, trabalhar com arquivos delimitados, entre outros). Porém, sou suspeito para falar porque sou o pai da criança. Então sugiro que, se você quiser fazer alguns testes e conhecer melhor esta biblioteca, faça o download dos binários dos arquivos fontes.

Agora, se você se empolgar e quiser contribuir para o projeto, entre na página do SourceForge e cadastre-se como desenvolvedor, você será muito bem vindo. Em caso de dúvidas, entre em contato comigo, que eu terei prazer em ajudar.



Links:

1 TrackBacks

Veja abaixo a lista de Blogs que referenciam este artigo: Importando e Exportando Arquivos Texto em Java.

URL de TrackBack para o artigo: http://blogs.felipecoury.com/mt-tb.cgi/4

Apresento JFileHelpers, toolkit que abstrai a complexidade de trabalhar com arquivos de texto em java, transformando automaticamente arquivos texto em listas de objetos, propriamente parseados, fazendo uso de anotações. Leia Mais

10 Comments

Olá...

Excelente trabalho. No último projeto que fiz, minha solução para trabalhar com arquivos de texto foi geração de código. Sempre pensei em algo com annotations, mas nunca tive tempo de fazer. De qualquer forma, está muito legal.

João,

Da próxima vez que for fazer algum projeto do gênero, dá um toque... Eu to precisando de um projetinho piloto para testar as funcionalidades da biblioteca. Quando quiser, estou a disposição.

Muito obrigado pelas palavras! Elas são o combustível de todo blogueiro e de todo desenvolvedor open source :-)

Se estiver afim, assine o feed do meu Blog, pretendo escrever bastante coisa interessante sobre java e dicas legais de produtividade em geral.

No mais, um abraço.

Felipe

Bom projeto. Me interesso sim. Tendo tempo, dou uma olhada no código e vejo se tenho como contribuir. Precisei disso há um tempo atrás. Desenvolvi uma Fluent Interface para configuração dos campos. Não usávamos Java 5, logo sem annotations. Aliás, a contribuição para o projeto seria permitir outros tipos de configuração além de annotations. Creio que assim, o projeto atingiria um público maior.

De qualquer forma, meus parabéns.

Bruno,

Obrigado cara. Devo lhe confessar que não sabia o que era uma Fluent Interface. Agora dei uma olhada no site do Martin Fowler e acho que entendi por cima, preciso ler melhor...

Qualquer idéia de como emular o que temos hoje em outras configurações seria fantástico. Havendo tempo, está convidado a ajudar.

Abraços,

Felipe.

Felipe Coury, beleza ?
Cara eu achei bem bacana a idéia. Com certeza irei dar uma olhada nessa API. Parabéns pela iniciativa.

Abraços

Fala Murício, tudo bem?

Obrigado pelo comentário. Precisando de qualquer coisa é só entrar em contato... Fique ligado aqui no meu Blog, vou tentar postar bastante coisa interessante, seja sobre Java ou sobre produtividade em geral!

Abração,
Felipe.

Olá!!

Parabéns Felipe por este artig. Muito bom mesmo!!!

Valew!
Abraços

Roberto,

Muito obrigado!

Abraços,
Felipe.

Fala Felipe!

Terei de trabalhar com arquivos textos nessa próxima semana e agora mesmo estava rascunhando em papel como criar um componente genérico que realizasse a conversão desses arquivos em beans automaticamente, mediante configurações por anotações ou interfaces fluentes.

Mas ainda bem que resolvi dar uma olhada no google e achei esse projeto. :D

Muito legal, parabéns pela iniciativa, provavelmente estarei utilizando na próxima semana e te passo um feedback.

Abraço.

Outra pergunta, eu só posso anotar campos públicos? Eu consigo anotar setters?

Deixe seu Comentário

Sobre este Artigo

Esta página contém um único artigo, escrito por Felipe Coury e publicado em February 11, 2008 6:49 PM.

Comandos Unix no Windows (sem Cygwin) é o artigo anterior deste blog.

Você já praticou uma soneca poderosa? é o próximo artigo deste blog.

O conteúdo atual está no índice principal o procure nos arquivos, onde você encontra todo o conteúdo.

Clicky Web Analytics