Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maikel Scheid

Ler arquivo txt com valores separador por ponto e virgula

Recommended Posts

Ops...

 

Salve colegas... to aqui com uma dúvida, tenho um arquivo txt com cerca de 140 mil linhas (Log de um sistema que preciso ler e jogar para um BD cada mês), sendo que em cada linha tenho 18 colunas separadas por ponto e virgula, e preciso carregar esse txt separando todas as colunas para jogar as informações para um banco de dados. Criei uma rotina que faz essa leitura, ou seja, carrego o conteúdo do txt em um Memo e vou percorrendo linha por linha usando o delimitador que é o ponto virgula para quebrar as colunas, até que funciona bem legal, porém o processo é muito demorado. Estou carregando as informações e preenchendo um ClientDataSet em memória, o qual faz o post a cada 1000 registros e então é limpado.

 

Gostaria de saber se alguém possui sugestão de facilitar esse processo, pensei em carregar o conteúdo direto no ClientDataSet, mas não sei se é possível (seria semelhante a forma que o excel usa), ou algum outro componente onde eu consiga tratar as informações e depois conseguir jogá-las para o banco de dados.

 

Utilizo Delphi 2006 + Banco de dados Firebird.

 

Agradeço desde já pela ajuda. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai meu amigo; Bom cara seguinte, trabalhar este tipo de importação e exportação no delphi geralmente é complicado. É como você mesmo disse funciona bem legal mas.... Sempre que preciso trabalhar com imp e exp gosto de utilizar o DTS do SQL Server. Ele importa e exporta para uma porrada de BD. não posso lhe garantir para o Firebird mas você pode tentar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos EduValeu ai pela dica, não conhecia esse Data Transformation Services, vou pesquisar mais sobre o mesmo, mas não sei se essa vai ser a melhor solução, pra mim beleza, vou utilizar aqui na minha máquina, mas em nível de sistema, acho que fica meio complicado, já que o mesmo sistema será utilizado por vários usuários diferentes, e ai envolverá muitas outras coisas, além de deixar aberto a segurança do meu BD já que o mesmo deverá estar acessível para que seja conectado durante a exportação do log. Precisaria mesmo de uma rotina que eu pudesse rodar pelo meu próprio sistema, como essa que tenho, porém muito demorada.Qualquer outra dica... agradeço.VlwAtt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi ai o seu problema, achei que precisava fazer isso uma unica vez.Cara na verdade acho meio dificil resolver este problema seu. Pq que ao invés de fazer isso somente uma unica vez no mês você nao faz isso mais vezes, tipo diariamente? Assim você teria menos registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E se você formatasse o arquivo com os inserts ? Digo, no próprio arquivo já vir com os comandos de insert, e depois somente teria de fazer o BD ler o arquivo e inserir... teria somente de ver se o firebird tem comando para ele ler um arquivo e inserir os registros...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu ai pelas dicas, mas como o Carlos Edu disse, é dificil resolver esse problema, o programa que gera esse log é referente a um log de impressão, e a cobrança é de forma mensal, sendo esse o periodo que preciso utilizar para ler o log, também já pensei de fazer em menos dias... mas acho que não seria o ideal a fins de depois gerar um demonstrativo de cobrança das datas de certo periodo, iria funcionar, mas tenho que fazer da forma mais viável ao cliente, que deseja que esse processo seja feita uma unica vez por mês...na data da cobrança.A ideia do marcio.theis é bem interessante, mas não me ajuda também porque o sistema que gerá o log não fui eu quem desenvolveu, e não tenho como alterar a estrutura e formato em que o log é salvo.Bom... agradeço a atenção de vocês... e mais uma outra dúvida agora então... se eu utilizar essa forma de leitura que tenho... passando de linha em linha e quebrando as colunas por ponto e virgula, qual a melhor forma de ir armazenando esses registros? Após cada linha realizar o insert/apply updates no meu banco de dados? Eu estava armazenando isso em um ClientDataSet em memória, e dava esse post/applyUpdates a cada mil registros... onde o sistema dava uma parada e depois continua até os próximos mil.... qual seria a melhor forma de fazer isso?Valeu ai pessoal...Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eu acho que poderia mudar somente um pouco a forma de inserir, sendo que já que vem separado tudo com vírgula, poderia somente escrever o comando de insert into tabela values (XXX,XXX,XXX,ETC), precisando somente formatar os campos string que iriam precisar de aspas, se você fizer a leitura direto do arquivo .txt e fizer um comando de .insert direto na tabela usando uma query, já vai ser mais rápido, visto que você não terá mais o tempo de carregar em um memo tudo, e ainda ficar gravando em memória, no caso seria ler do arquivo, formatar e inserir, com certeza seria mais rápido, e claro a sua tabela de log precisa estar bem indexada e um bom servidor, para garantir a eficiência...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.