Abstração para tratamento de arquivos texto em Java

Amigos do GUJ,

Tem algum tempo que estou escrevendo a biblioteca JFileHelpers, que abstrai a complexidade de trabalhar com arquivos-texto em java, fazendo uso de anotações para automatizar o trabalho.

Quem estiver interessado, dê uma lida no artigo que postei no meu Blog a respeito:
http://blog.felipecoury.com/jep/2008/02/java-text-import-export.html

Se gostarem do trabalho e tiverem interesse, estou precisando de contribuidores :slight_smile:

Abraços a todos!

Achei interessante.

Fiquei curioso com duas coisas:

1a: Como ele trabalha com arquivos grandes, tipo… uns 2 gigas.

2a: Consegue trabalhar com registro variável, tipo… se o primeiro caracter for 1, o registro significa uma coisa, se for 2 significa outra… Isso é muito comum quando a gente integra com pessoal que gera arquivos em Cobol…

Estou querendo ajudar no projeto… Como fazer?

andreban,

Primeiro de tudo, me mande um e-mail ou uma mensagem privada que eu dou acesso de developer no projeto, daí vc baixa via SVN e pode começar a dar uma fuçada.

Agora respondendo:

1: Boa pergunta! Posso ser sincero? Não tenho a menor idéia… Aliás, seria uma ótima área para ser atacada! :slight_smile:

2: Sim, há suporte para este cenário sim, além de layout de mestre-detalhe. Não tenho nenhum exemplo escrito ainda para registros condicionais, mas segue um enum que ilustra as possibilidades de registros condicionais:

public enum RecordCondition {
	None, IncludeIfContains, IncludeIfBegins, IncludeIfEnds, IncludeIfEnclosed, 
	IncludeIfMatchRegex, ExcludeIfContains, ExcludeIfBegins, ExcludeIfEnds, 
	ExcludeIfEnclosed, ExcludeIfMatchRegex;
}

Com isso você processa linhas diferentes com beans diferentes. Além disso, segue um trecho de MasterDetail, que implementa um Selector, que pode ser usado para também para registros condicionais:

engine = new MasterDetailEngine<CustomersVerticalBar, OrdersVerticalBar>(CustomersVerticalBar.class, OrdersVerticalBar.class, 
                new MasterDetailSelector() {
                        @Override
                        public RecordAction getRecordAction(String recordString) {
                                if (Character.isLetter(recordString.charAt(0)))
                                        return RecordAction.Master;
                                else
                                        return RecordAction.Detail;
                        }
		});		

Espero ter ilustrado, por alto, os cenários atendidos pela biblioteca.

Abraços!

Um projeto recente que manipula isso de uma forma interessante é o Spring - Batch : http://static.springframework.org/spring-batch/
De repente você poderia contribuir para este projeto.

Vlw.

gastaldi,

Nossa, li por cima a descrição deste projeto e parece fantástico. Vou dar uma olhada sem dúvidas.

Obrigado pela dica!

Abraços.

MUITO bacana o projeto.

Recentemente tive de fazer um trabalho de importação/exportação de dados para um dado ERP famoso e inacreditávelmente tosco que era inteiramente baseada em arquivos no formato texto tais como os que são manipulados pela sua biblioteca. E foi um processo incrívelmente trabalhoso, sua biblioteca me teria quebrado um tronco de sequóia. Parabéns.

Arquivos txt formatados são algo que infelizmente ou felizmente ainda são MUITO usados na indústria, e que estão completamente esquecidos atualmente.

NO entanto, fiquei com uma dúvida: você pode definir a ordem dos campos? Ou a ordem é definida de acordo com a ordem na qual os atributos das classes são declarados na classe?

Outra pergunta: qual a licença que você vai aplicar a esta biblioteca? E como devemos proceder para participar do seu projeto?

kicolobo,

[quote]MUITO bacana o projeto.

(…)

Arquivos txt formatados são algo que infelizmente ou felizmente ainda são MUITO usados na indústria, e que estão completamente esquecidos atualmente.[/quote]

Obrigado pelos comentários. Concordo plenamente: infelizmente o velho formato texto ainda é padrão para muita coisa. Prá ser bem sincero, eu não vejo tanta evolução em usar XML não. Veja bem: isso é uma opinião extremamente pessoal, não quero começar nenhum flame war com o pessoal que defende XML com unhas e dentes :slight_smile: E também, isso são another five hundred :smiley:

Meu maior desejo agora é arrumar um caso de uso para esta biblioteca, gostaria de colocá-la a prova. Então se você (ou qualquer outra pessoa que esteja lendo este tópico) precisar automatizar um import ou export de arquivo texto, manda uma MP, e-mail ou até mesmo mensagem nos fóruns que eu dou uma ajuda. Seria bem legal.

Hoje é usada a ordem natural que eles aparecem no bean (nunca tinha parado prá pensar nisso!), mas nada impede de implementar alguma anotação - ou até um parâmetro de uma anotação - para manipular isso.

Ela está com a licença GPL hoje, com aquele disclaimer nos cabeçalhos do Código Fonte. Editado: Pô, esqueci de responder a mais importante: para contribuir fale comigo que eu libero seu usuário do SourceForge no projeto. Beleza? Pode ser por MP ou e-mail. Possíveis pessoas que possam contribuir são MUITO bem vindas.

Abraços!

Existe algum “user guide”?

loquaz,

Como todo projeto que se preza em seu início: documentação zero :frowning: Existe uma vasta documentação do projeto inspirador, em C#: http://www.filehelpers.com. Portar a documentação para Java é uma coisa que tenho muita vontade que aconteça também, mas se vc estiver com pressa, acredito que usar o link que mandei como referência é simples. C# e Java tem suas diferenças mas quase sempre dá pra entender e portar intuitivamente.

Abraços!

Fala irmão,

Primeiro lugar, parabenizar pela iniciativa e pedir desculpas por não ter felicitado-te no post anterior…rs

seguinte, ainda não baixei o source pra verificar a API, mas queria saber se existe como configurar a engine no momento da instanciação indicando meu bean deve ter seus campos mapeados para posições no layout que constam em linhas diferentes.

Exemplo (fictio e bobo por questões de simplicidade) :

Tenho o bean Celular com os campos: id, modelo, marca, agenda, fabricante.
Fabricante é um tipo de referencia definido por mim, então as informações dos seus campos constaram em uma linha após as informações basicas do celular (id, modelo, marca, agenda)

1, V50, motorola, 100 —> info basica do bean Celular
1, Motorola, 0000151 —> info basica do bean Fabricante

existe a possibilidade de ler um arquivo neste formato? onde as informações para cada registro constam em mais de uma linha?

Desde já agradecido,

Abração!

loquaz,

Obrigado mesmo pelas felicitações :slight_smile: Eu considero que só o fato de a pessoa ter tirado um tempo para responder já é em si uma felicitação, então sem problemas! :wink:

É possível sim, mas você vai ter que fazer uma diferenciação entre as linhas (por exemplo, linhas pares mapeiam para o bean do tipo A e linhas ímpares para o bean do tipo B – ou usar algum tipo de identificador único que caracterize as linhas, como um caractere ou expressão que elas contenham).

No exemplo que vc citou, uma das possibilidades que me vêm à cabeça agora é de existirem dois beans, um Celular e outro Fabricante. Na hora de definir o Engine, vc passa prá ele um Selector, dizendo qual registro é mapeado para qual bean. Se as regras pré existentes não lhe atenderem, vc pode sempre implementar um delegate para definir como é feito o mapeamento…

Se quiser saber mais, baixe o código fonte e dê uma olhada nas classes JUnit que vêm junto. Existem vários casos abordados por lá.

Abração!

Editado: BBCode quote e URL estavam errados…

Felipe, tudo bem?

Vi seu projeto e parece legal. Mas um de nossos fornecedores sugeriu usarmos sua biblioteca para leitura de flat files.

Entrei no site do projeto e, como arquiteto do projeto, fiquei preocupado com algumas coisas:

  1. Falta de documentação e exemplos
  2. Versão atual (qual é)? É alhpa, beta, final estável?
  3. Qual o status do projeto? Parado, em pleno vapor, morto?
  4. Há mais desenvolvedores trabalhando, uma comunidade, ou só você?

São considerações que devo levar ao escolher uma solução para um projeto corporativo grande.

Abraços

Oi Daniel,

Vamos lá:

A falta principal não é de nenhum dos dois, e sim de tempo mesmo :slight_smile:

No próprio projeto existem exemplos e JUnit tests que ajudam a ver as possibilidades do projeto. Além disso, ele é um port do FileHelpers (veja em http://www.filehelpers.com).

Ele deve ser considerado como alpha, nunca foi testado em um projeto em produção. Seria algo muito interessante, mas também não ocorreu por falta de oportunidade.

Por enquanto, parado, quase morto :slight_smile: Eu tenho planos de fazer um site com detalhes sobre a biblioteca, mas voltamos ao ponto 1)

Tem mais um desenvolvedor na Inglaterra que implementou algumas melhorias. Fora isso, é Felipe Futebol Clube mesmo :slight_smile:

E faz muito bem! Eu acredito que esta biblioteca esteja em um ponto onde possa começar a ser utilizada para coisas não-críticas, porém em um projeto em produção, acho muito arriscado, embora tenho maior interesse em amadurecer a biblioteca.

É isso.

Abraços e boa sorte!

Se fosse eu o responsável pela implementação do módulo do sistema, eu até apostaria. Mas como sou eu o responsável pela escolha da tecnologia corporativamente, fico receoso.

Tecnicamente parece muito bom, mas todos sabem que não são apenas questões técnicas que levam às escolhas tecnológicas num projeto.

Mesmo assim, obrigado.

[quote=danieldestro]Se fosse eu o responsável pela implementação do módulo do sistema, eu até apostaria. Mas como sou eu o responsável pela escolha da tecnologia corporativamente, fico receoso.

Tecnicamente parece muito bom, mas todos sabem que não são apenas questões técnicas que levam às escolhas tecnológicas num projeto.

Mesmo assim, obrigado.[/quote]

Se o mesmo projeto (idêntico) fosse IBM-SUN-MS-WTF o seu “fico receoso” ainda seria fato? Se o projeto parece bom, gaste algumas horas num estudo de caso.

Bom,

Tirando o fato de que amassei e joguei fora inúmeras definições que o pessoal (‘capacitado’) da veio e fez aqui, eu, seguindo os requisitos gerenciais e de governança corporativa, tenho que respeitar e aderir a algumas defnições. E, (in)felizmente, as grandes corporações, nestes quesitos, são mais “compliance”, pois oferecem suporte, documentação e possuem mais pessoas capacitadas no mercado.

Como eu mesmo disse anteriormente, se fosse um projeto que eu mesmo tivesse implementando, certamente eu apostaria na biblioteca ou geraria um branch interno (respeitando a licença).

Mas como sou um mero consultor/arquiteto que tenho que seguir certas restrições, tenho que me preocupar com certos detalhes que não combinam muito com escolhas puramente técnicas.

Atente para o fato que o “pai” do projeto disse que não tem nenhum caso real ou de sucesso implementado em produção.

Mas mesmo assim, estas minhas preocupações não tiram o mérito do projeto, que, tecnicamente, me agradou muito.

Capisce, bello?

Olha,
acabei de usar o JFileHelpers para uma migração.
No caso, eu precisava gerar um arquivo contendo mais ou menos uns 100.000 registros.

Com o JFileHelpers, foi muito fácil de fazer esta migração e, o mais bacana, incrívelmente rápido.

Show de bola!

Esta thread me animou e eu dei um start no website do projeto.

Dêem uma olhada:

:arrow: Website: http://www.jfilehelpers.com
:arrow: Post no meu blog sobre o site: http://blog.felipecoury.com/jep/2008/06/jfilehelpers-arquivos-texto-se.html

Vejam o post no blog do porquê acho que foi importante criar o website.

Abraços!

Você deverá receber alguma contribuição “voluntária” para seu projeto. Foi uma condição que eu impus ao nosso fornecedor.

Como assim!? :slight_smile: