Newsgroup: it.comp.lang.visual-basic
Titolo: leggere *.txt da 10mb blocca vb!! help

...salve, sono sempre quì
nelle puntate precedenti, grazie all'aiuto di mooolti di voi ero riuscito
a realizzare un programmino che permette di estrarre gli e.mail da elenchi
di testo...
...testato con piccoli file di prova, poi + grandini ho scoperto che il
text box non era in grado di contenere molto testo... quindi sono passato
al rich text box, sembrava funzionare tutto fino a chè oggi pom
provo a sbattergli dentro un file da 10mb (con mooolti spazi vuoti)...
...risultato: mi si blocca vb, ma non per effettuare i l debug, debbo
proprio
usare task manager x sbloccare...
provo con un file + piccolo... idem....  ma allora?
ho inserito un contatore x vedere quante righe lavora:  circa 3.300 con un
file
da 90kb !!!!!!
...vi è già capitato?
..mando volentieri il mio listato+il file incriminato....
--
--------------------------------------------
"Che la vostra memoria non s'imboli
  nel primo mondo da l'umane menti,
  ma s'ella viva sotto molti soli "
--------------------------------------------
molte onorevoli grazie a Voi
^____^
Luca


Fammi indovinare... 32.767, giusto? >=)
Lokar
P.S. Usa un contatore LONG

 ha scritto nel messaggio
news:iu5C8.13$ln3...@nreader1.kpnqwest.net...

...nisba... con long peggiora....
...allego il listato... ma do volentieri anche il file campione.txt....
...heeelp...
Dim Email As Variant
Private Sub cmdApri_Click()
            'On Error GoTo ErrorHandler 'Attiva la routine di gestione degli
errori.
            '
            'ErrorHandler:            ' Routine di gestione degli errori.
            'Screen.MousePointer = vbDefault 'Ripristina il puntatore del
mouse.
            'Exit Sub 'invece di Resume puoi usare exit per uscire dalla
routine.
            ''Resume   ' Riprende l'esecuzione alla stessa
            '          ' riga che ha generato l'errore.
    Dim nomefile As String
    Dim testo As Variant
    CommonDialog1.Filter = "File di testo (*.txt)|*.txt|File m@il
(*.m@l)|*.m@l|Tutti i file (*.*)|*.*"
    CommonDialog1.ShowOpen
    nomefile = CommonDialog1.FileName
    cmdEstrai.Enabled = True
    mnuEstrai.Enabled = True
    '----------------
Dim Contamail As Integer
Contamail = 0
    'Ammettiamo che leggi il tuo file una riga alla volta
    '(ad esempio con LineInput) ed ogni riga la leggi
    'nella variabile Riga:
Open nomefile For Input As #1   ' Apre il file.
   'Imposta il puntatore del mouse = a clessidra.
   Screen.MousePointer = vbHourglass
Do While Not EOF(1)   'Ripete fino alla fine del file.
   Line Input #1, riga   'Assegna la riga a una variabile.
   testo = testo & (Chr(13) + Chr(10)) & riga
   DoEvents
        Do
        chiocciola = InStr(riga, "@") 'cerca la pos di "@" solo x vedere se
c'è...
        If chiocciola = 0 Then Exit Do '...se c'è, di sicuro è <> da 0
quindi può continuare, in caso contrario esce per questa riga
        Contamail = Contamail + 1
        Inizio = InStrRev(riga, " ", chiocciola) 'trova la posizione dello
spazio vuoto, cioè dove poi inizia l'indirizzo...
            If Inizio = 0 Then
            riga = " " & riga 'siccome (inizio=0) causa un'errore, aggiungo
un " "
            Inizio = InStrRev(riga, " ", chiocciola + 1)
            End If
        Fine = InStr(chiocciola, riga, " ")
            If Fine = 0 Then 'se Fine dà 0 causa l'errore...(non può essere
a 0 che sarebbe la prima posizione..)
            Fine = InStr(chiocciola, riga & " ", " ")
            End If
            If Contamail = 1 Then 'questa if serve per non mettere il ";"
davanti al 1° indirizzo
            Email = Mid(riga, Inizio, Fine - Inizio)
            Else
            'Email = Email & " ; " & Mid(riga, Inizio, Fine - Inizio)
            Email = Email & " ; " & (Chr(13) + Chr(10)) & Mid(riga, Inizio,
Fine - Inizio)
            End If
        riga = Mid(riga, Fine + 1) 'toglie l'email appena trovato e
ripropone il resto di riga (con loop) ad un'altro controllo della
chiocciola..
        Loop
Text1.Text = "Gli indirizzi e.mail trovati in questo file sono: " &
Contamail
   'Debug.Print Riga   ' Scrive nella finestra Immediata.
Loop
Close #1   ' Chiude il file.
'txtFile.Text = testo
'txtFile.Enabled = True
RichTextBox1.Text = testo
RichTextBox1.Enabled = True
   'Ripristina il puntatore del mouse.
   Screen.MousePointer = vbDefault
End Sub
Private Sub cmdEsci_Click()
mnuEsci_Click
End Sub
Private Sub cmdEstrai_Click()
mnuEstrai_Click
End Sub
Private Sub Command1_Click()
Load Form1
Form1.Show
End Sub
Private Sub Form_Load()
    cmdEstrai.Enabled = False
    cmdEstrai.ToolTipText = "Estrae gli indirizzi dal testo quì a fianco"
    cmdApri.ToolTipText = "Apri un file contenente indirizzi e.mail"
    Text1.Text = "Gli indirizzi e.mail trovati in questo file sono: ...0"
    Text1.Enabled = False 'spengo text1
    RichTextBox1.Enabled = False
    'RichTextBox1.ScrollBars = rtfBoth
    mnuSeleziona.Enabled = False
    mnuCopia.Enabled = False
    mnuIncolla.Enabled = False
    mnuNuovo.Enabled = False
    mnuSalva.Enabled = False
    mnuTaglia.Enabled = False
    mnuhelp.Enabled = False
    mnuEstrai.Enabled = False
End Sub
Private Sub mnuApri_Click()
cmdApri_Click
End Sub
Private Sub mnuEsci_Click()
End
End Sub
Private Sub mnuEstrai_Click()
'txtFile.Text = Email
RichTextBox1.Text = Email
cmdCopia = True
mnuSeleziona.Enabled = True
End Sub
Private Sub mnuSeleziona_Click()
RichTextBox1.SetFocus
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
RichTextBox1.SelText = RichTextBox1.Text
'Clipboard.Clear
'Clipboard.SetText (RichTextBox1.Text)
Beep
MsgBox "Selezionato!...ora puoi copia ed incollare...", vbInformation,
"Estrai e.mail"
'MsgBox "Copiato!...ora puoi incollare...", vbInformation, "Estrai e.mail"
End Sub
Private Sub mnuVersione_Click()
    MsgBox "Estrai e.m@il versione 1.0 Beta", vbInformation, "Estrai e.mail"
End Sub

 End Sub
Al di la' delle considerazioni stilistiche, l'errore che riscontri nei
file troppo grandi puo' dipendere da due fattori:
1) Quello gia' indicato di un uso delle variabili Integer piuttosto che
delle Long. Le variabili Long sono piu' "capienti" e meglio si confano
all'uso che ne fai. Inoltre essendo di 4 byte (= 32 bit), sono meglio
"digerite" dalla CPU (che lavora appunto a 32 bit), in particolare se si
usano come contatore.
2) 10 MB di file sono decisamente troppi, tu tenti di caricare in
un'unica variabile TUTTO il testo. Al posto tuo "scaricherei" la
variabile nella RichTextBox ogni tanto.
In ogni caso 90KB sembrerebbero piu' che accettabili e mi sembra strano
che si fermi per questioni di "memoria".
Spero di esserti stato di aiuto. Per come si aprono e chiudono i file e
considerazioni varie (stilistiche ma anche indicazione di fonti di bug)
ti rimando al thread:
"errore di run-time 53 ???" del 08/05/02 avviato da " ' MG ' ".
Anche a te consiglio di "ripassare" il manifesto del newsgroup per
un'opportuna scelta dell'oggetto dell'email.
Alla tua si confaceva forse:
    [?]Problemi lettura file di testo > 90KB
oppure
    [?] Blocco VB in lettura di file > 90KB
Happy Coding =)
Lokar

     [?] Blocco VB in lettura di file > 90KB
Le considerazioni e i suggerimenti comunque sono ancora validi ;-)
Happy Coding =)
Lokar

 PS Non č che sei di (MO) e dai lezioni ?-)
Sempre su questi schermi =)
No sono di Roma e le "lezioni" mi piace tenerle sul NG ad uso e consumo
di chiunque possa essere interessato ;-)
Lokar
P.S. Ti prego di proseguire i thread inerenti VB sul Newsgroup.

 "errore di run-time 53 ???" del 08/05/02 avviato da " ' MG ' ".
*** ancora da vedere, ma è in lista...
[...continuo sull'altra risposta del tuo prox post]

 >>         Loop
...se mi "mangi" 2 spazi [Riga = Mid(Riga, Fine + 2) 'ET VOILA'] invece che
1,
di questa serie:  
a...@bbb.it
 
P...@bbb.it
 [raro in effetti, ma possibile] mi
"mangi" la "P"
...per finire allego un estratto di un file da 10mb [19Kb] che dà altri
problemi:
...provo a testarlo dopo tutte queste modifiche x vedere se...
...lui si ferma (come se avesse finito) alle prime righe (tralasciando tante
mail..)...
..dico "colpa dei 10mb.." "provo a ridurlo..."  nisba....  ????
grazie ancora
Luca

 ..dico "colpa dei 10mb.." "provo a ridurlo..."  nisba....  ????
Intanto, non si capisce nulla di quello che hai scritto. L'hai testato?
Non l'hai ancora testato?
L'hai testato mentre scrivevi l'email? Ma soprattutto: *Qual'e' la
domanda?*
A questo punto mi viene da pensare che l'algoritmo che usi per estrarre
le stringhe non vada poi tanto bene...
a naso direi che quando aggiungi uno spazio prima e/o dopo, combini
qualche guaio, e dovresti rimuoverlo altrimenti come abbiamo visto va in
loop infinito.
Probabilmente qualcosa del tipo:
*** BEGIN SNIPPET ***
Dim bSpazioAggiuntoDopo As Boolean
Do 'Ciclo esterno
    Do 'Ciclo interno
        bSpazioAggiuntoDopo = False
        '[...]
        If Fine = 0 Then
            Fine = InStr(Chiocciola, Riga & " ", " ")
            bSpazioAggiunto = True 'OCCHIO QUI!
        End If
        '[...]
        If bSpazioAggiuntoDopo Then
            Riga = Mid(Riga, Fine + 2)
        Else
            Riga = Mid(Riga, Fine + 1)
        End If
    Loop
Loop
*** END SNIPPET ***
Non ho comunque approfondito l'algoritmo che IMHO dovrebbe comunque
essere rivisto un pochino. In ogni caso una "pezza" di questo tipo
dovrebbe funzionare =)
Happy Coding =)
Lokar


..il problema "odierno" è che provando anche il piccolo file che ho mandato
NON raggiunge la fine, ma si ferma prima... l'ho guardato con f8 ma non
trovo nessun
errore, riesci a darci un'occhio tu?
;-)
Luca

 trovo nessun errore, riesci a darci un'occhio tu?
Non potro' trovare di piu' di quanto possa trovare tu!
Ti ho dato alcuni suggerimenti sul NG (parti del testo che non hai
quotato nel rispondere).
Ho postato anche un'abbozzo di "possibile" soluzione (a naso). Fai
qualche piccolo sforzo anche tu! =)
Per inciso, ribadisco e sottolineo che il problema nasce, a mio avviso,
nelle "aggiunte" di spazi che fai.
Happy Coding =)
Lokar
P.S. Seguo attivamente la ML e TUTTI i thread  a cui ho partecipato, non
e' necessario che ogni volta mi mandi un'email privata in copia!