LER ARQUIVO TEXTO GRANDE
Estou querendo desenvolver um programa para recuperar emails do thunderbird.
ele funciona assim:
qdo vc apaga um email, ele não remove do arquivo de dados... ele apenas marca o email como excluido... se mandar compactar os arquivos ai sim ele remove...
as mensagens ficam armazenadas em um arquivo que pode ser aberto como texto.
só que esses arquivos são enormes... o meu por exemplo de uma pasta que tem 7Mb tem quase 90.000 linhas... esse eu consigo abrir em algum editor de texto sem problemas... agora um cliente meu só uma pasta dele tem mais de 500 Mb e ele apertou shift + del sem querer em todas as mensagens dele...
mas não tem como eu abrir esse arquivo em lugar nenhum... ja tentei pelo word.. excel... bloco de notas.. wordpad... notepad2... e nenhum funciona..
o unico que eu consegui abrir foi no access mas ele não mostrou todas as linhas... e não tinha como eu salvar em arquivo depois...
o que eu queria saber é:
- Tem como eu abrir arquivos texto desse tamanho pelo VB?
- Tem como eu só buscar essas determinadas linhas no arquivo texto e depois mandar alterar essa linha ou eu tenho que abrir todo o arquivo?
exemplo de como é o arquivo
a parte em negrito é onde ele marca o status da mensagem:
From - Wed Nov 29 08:50:12 2006
X-Account-Key: account2
X-UIDL: 1164797386.18944.hm145,S=83227
X-Mozilla-Status: 0008
X-Mozilla-Status2: 10010000
Return-Path: <carmen@nanana.com.br>
Delivered-To: tedablio-hugo@tedablio.com.br
X-CTCH-RefID: str=0001.0A010204.456D64D6.005D,ss=2,fgs=0
Received: (qmail 18940 invoked by uid 1000); 29 Nov 2006 10:49:43 -0000
Received: from unknown (10.1.10.55)
by hm145.locaweb.com.br with QMQP; 29 Nov 2006 10:49:43 -0000
X-LocaWeb-Detect-Virus: NON
Received: from unknown (HELO hm323.locaweb.com.br) (200.234.205.150)
by hm55.locaweb.com.br with SMTP; 29 Nov 2006 10:49:39 -0000
Received: (qmail 21206 invoked from network); 29 Nov 2006 10:49:37 -0000
Received: from unknown (10.1.10.145)
by hm323.locaweb.com.br with QMQP; 29 Nov 2006 10:49:37 -0000
Received: from unknown (HELO DIRETORIA) (carmen@nanana.com.br@200.168.68.15)
by hm145.locaweb.com.br with SMTP; 29 Nov 2006 10:49:36 -0000
From: "Carmen" <carmen@nanana.com.br>
qualquer opnião é bem vinda..
ele funciona assim:
qdo vc apaga um email, ele não remove do arquivo de dados... ele apenas marca o email como excluido... se mandar compactar os arquivos ai sim ele remove...
as mensagens ficam armazenadas em um arquivo que pode ser aberto como texto.
só que esses arquivos são enormes... o meu por exemplo de uma pasta que tem 7Mb tem quase 90.000 linhas... esse eu consigo abrir em algum editor de texto sem problemas... agora um cliente meu só uma pasta dele tem mais de 500 Mb e ele apertou shift + del sem querer em todas as mensagens dele...
mas não tem como eu abrir esse arquivo em lugar nenhum... ja tentei pelo word.. excel... bloco de notas.. wordpad... notepad2... e nenhum funciona..
o unico que eu consegui abrir foi no access mas ele não mostrou todas as linhas... e não tinha como eu salvar em arquivo depois...
o que eu queria saber é:
- Tem como eu abrir arquivos texto desse tamanho pelo VB?
- Tem como eu só buscar essas determinadas linhas no arquivo texto e depois mandar alterar essa linha ou eu tenho que abrir todo o arquivo?
exemplo de como é o arquivo
a parte em negrito é onde ele marca o status da mensagem:
From - Wed Nov 29 08:50:12 2006
X-Account-Key: account2
X-UIDL: 1164797386.18944.hm145,S=83227
X-Mozilla-Status: 0008
X-Mozilla-Status2: 10010000
Return-Path: <carmen@nanana.com.br>
Delivered-To: tedablio-hugo@tedablio.com.br
X-CTCH-RefID: str=0001.0A010204.456D64D6.005D,ss=2,fgs=0
Received: (qmail 18940 invoked by uid 1000); 29 Nov 2006 10:49:43 -0000
Received: from unknown (10.1.10.55)
by hm145.locaweb.com.br with QMQP; 29 Nov 2006 10:49:43 -0000
X-LocaWeb-Detect-Virus: NON
Received: from unknown (HELO hm323.locaweb.com.br) (200.234.205.150)
by hm55.locaweb.com.br with SMTP; 29 Nov 2006 10:49:39 -0000
Received: (qmail 21206 invoked from network); 29 Nov 2006 10:49:37 -0000
Received: from unknown (10.1.10.145)
by hm323.locaweb.com.br with QMQP; 29 Nov 2006 10:49:37 -0000
Received: from unknown (HELO DIRETORIA) (carmen@nanana.com.br@200.168.68.15)
by hm145.locaweb.com.br with SMTP; 29 Nov 2006 10:49:36 -0000
From: "Carmen" <carmen@nanana.com.br>
qualquer opnião é bem vinda..
Carinha, o vb aguenta em cada objeto text apenas 64Kb. Se vc tem um cliente com 500Mb eu sugiro vc fazer um programa pra ler esse arquivo e guardar em um banco de dados, tipo SQL, MySQL
Realmente trabalhar com textos enormes é um transtorno!
Boa sorte
Realmente trabalhar com textos enormes é um transtorno!
Boa sorte
André, só pra descordar um pouquinho.
Texto do MSDN
2 bilhões de caracteres é bem mais que 64k, mas devem todos ser ASCII
Concordo com vc, que ele vai ter que gravar em banco de dados.
Uma idéia pra ganhar em PERFORMANCE, mesmo que seja ainda um processo demorado, seria vc abrir esse arquivo direto no componente RICHTEXTBOX.
(não sei se ele comportará um arquivo desse tamanho)
Abra o arquivo com o RichTextBox.FILENAME = "C:\ARQUIVO.TXT"
e vá lendo linha a linha com o Substring e Instring recortando VbCrLfs (pois se ler tudo em variavel vai dar OverFlow) e gravando linha a linha do seu BD.
Outra alternativa, é trabalhar com ele em C++
Em C++ vc consegue ler direto da memória, através dos fOpen / fRead / fClose ... (ou algo assim)
O problema do VB é esse de não ler bytes da memória diretamente... Não existe conceito de Ponteiros pra isso...
Texto do MSDN
Citação:There are two kinds of strings: variable-length and fixed-length strings.
A variable-length string can contain up to approximately [txt-color=#ff0000]2 billion[/txt-color] (2^31) characters.
A fixed-length string can contain 1 to approximately 64K (2^16) characters.
2 bilhões de caracteres é bem mais que 64k, mas devem todos ser ASCII
Concordo com vc, que ele vai ter que gravar em banco de dados.
Uma idéia pra ganhar em PERFORMANCE, mesmo que seja ainda um processo demorado, seria vc abrir esse arquivo direto no componente RICHTEXTBOX.
(não sei se ele comportará um arquivo desse tamanho)
Abra o arquivo com o RichTextBox.FILENAME = "C:\ARQUIVO.TXT"
e vá lendo linha a linha com o Substring e Instring recortando VbCrLfs (pois se ler tudo em variavel vai dar OverFlow) e gravando linha a linha do seu BD.
Outra alternativa, é trabalhar com ele em C++
Em C++ vc consegue ler direto da memória, através dos fOpen / fRead / fClose ... (ou algo assim)
O problema do VB é esse de não ler bytes da memória diretamente... Não existe conceito de Ponteiros pra isso...
A propósito.
Uma boa sugestão seria aprender bem pouquinho de C++ pra poder repartir esse arquivo em pequenos arquivos e com isso conseguir lê-los em VB
Assim, vc criaria uma DLL com uma pequena rotina tipo: "repartirArquivo(caminho do arquivo, diretorio de destino)" e depois que ela executar ler os arquivos quebrados...
Uma boa sugestão seria aprender bem pouquinho de C++ pra poder repartir esse arquivo em pequenos arquivos e com isso conseguir lê-los em VB
Assim, vc criaria uma DLL com uma pequena rotina tipo: "repartirArquivo(caminho do arquivo, diretorio de destino)" e depois que ela executar ler os arquivos quebrados...
mas eu não quero salvar as mensagens...
só quero alterar aquela linha que eu mostrei...
eu pensei em abrir com o open, mas até percorrer todas as linhas pra achar o titulo da mensagem e o status acho que vai demorar muito... [S90]
só quero alterar aquela linha que eu mostrei...
eu pensei em abrir com o open, mas até percorrer todas as linhas pra achar o titulo da mensagem e o status acho que vai demorar muito... [S90]
Citação:LIONHEART escreveu:
A propósito.
Uma boa sugestão seria aprender bem pouquinho de C++ pra poder repartir esse arquivo em pequenos arquivos e com isso conseguir lê-los em VB
Assim, vc criaria uma DLL com uma pequena rotina tipo: [Ãâ€ÂÂ]repartirArquivo(caminho do arquivo, diretorio de destino)[Ãâ€ÂÂ] e depois que ela executar ler os arquivos quebrados...
até q é uma boa... eu to precisando aprender outra linguagem mesmo... eu tenho instalado o wxDEvcpp mas falta tempo pra mexer....
eu vou fazer um teste com o Richtextbox...
Até onde eu sei, o VB6 são 64kb... acho que essa citação é do .NET (não sei)
Mas a idéia do Lion é boa e não custa tentar... usar RichText
Vou dar uma pesquisada nos limits dos objetos e passo pro pessoal!
Mas a idéia do Lion é boa e não custa tentar... usar RichText
Vou dar uma pesquisada nos limits dos objetos e passo pro pessoal!
eu fiz um teste aqui com um arquivo de 200Mb abrindo no Rich e demorou 2 min...
Se ele aguentou os 200 MB então provavelmente ele aguenta os 500.
Acontece que vc não tem como guardar tudo isso numa variavel pra percorrer uma a uma.
Vc VAI precisar separar em pequenos arquivos para trabalhá-lo.
Acontece que vc não tem como guardar tudo isso numa variavel pra percorrer uma a uma.
Vc VAI precisar separar em pequenos arquivos para trabalhá-lo.
Tópico encerrado , respostas não são mais permitidas