LER ARQUIVO TEXTO GRANDE

HUGOSSOUZA 06/12/2006 09:31:22
#188264
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..

USUARIO.EXCLUIDOS 06/12/2006 09:42:25
#188266
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
LIONHEART 06/12/2006 10:05:10
#188273
André, só pra descordar um pouquinho.

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...
LIONHEART 06/12/2006 10:07:10
#188276
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...
HUGOSSOUZA 06/12/2006 10:10:21
#188277
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]
HUGOSSOUZA 06/12/2006 10:18:12
#188280
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...
USUARIO.EXCLUIDOS 06/12/2006 14:13:06
#188341
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!
HUGOSSOUZA 06/12/2006 14:18:02
#188344
eu fiz um teste aqui com um arquivo de 200Mb abrindo no Rich e demorou 2 min...

LIONHEART 06/12/2006 15:05:56
#188358
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.
Tópico encerrado , respostas não são mais permitidas