Newsgroup: it.comp.lang.visual-basic
Titolo: leggere un file TXT riga per riga.

ciao a tutti...ho un "piccolo/enorme" problema.
ho un file txt dal quale devo tirare fuori dei dati, dovrei leggerlo riga
per riga.
ho scritto questo codice:
Open (file) For Input As #1
Do Until EOF(1)
    Line Input #1, tempLine
....mio codice di ricerca sulla riga corrente tempLine
Loop
Close #1
e funziona...ma solo fino a quando il file e' di piccole dimensioni.
quando il file diventa grande (3 mb) molto grande (10 mb) l'applicazione non
parte nemmeno,
oppure si schianta dopo qualche minuto.
il file (non ridete) dovrebbe essere letto e processato in pochi secondi
invece.
suggerimenti ?
aiuti ?
miracoli ?
...altra domanda misteriosa: si possono leggere dati da un file binario ?
ogni miracolosa risposta e' assoultamente benAccetta.
ciao e grazie.

 ...altra domanda misteriosa: si possono leggere dati da un file binario ?
Open <file> For Binary As #1
però non controllare EOF(1), ma
Seek(1) < LOF (1)
per controllare quando arrivi alla fine del file.
Es.
Do While Seek(1) < LOF(1)
.....esegui il codice
Loop

 binario ?
Sì, con Open ... For Binary
Vedi la guida.

 binario ?
certo: nella open usa For Binary
ciaociao

Con Ado.stream hai provato?

 wrote in message
news:bo5qo9$16vc9b$1...@ID-174464.news.uni-berlin.de...


 Con Ado.stream hai provato?
No, mai. Ma credo che sia più giusto non tirare in ballo ADO quando se ne
può fare a meno...
Se il suo progetto non necessita di connettersi a una fonte dati dovrebbe
includere i riferimenti ad ADO solo per leggere un file, e sinceramente mi
sembra superfluo. Per quanto riguarda le prestazioni non saprei, magari dopo
faccio un paio di prove e comunico
ciaociao

 potrebbero arrivare pero' a 10.
Sembra a posto. Fai una prova, col file da 10 mb. Lascia il ciclo di lettura
e togli ogni altra istruzione. Vedi quanto impiega a leggere il tutto o se
si impianta. Se non si impianta (dovrebbe leggere il tutto nel giro di 10/30
secondi), rimettici dentro il tutto aggiungendo, dove vuoi, ma nel ciclo, un
DoEvents.

 miracoli ?
mmmm... il codice non fa nulla di cosě dispendioso in fatto di cpu....
non č che il file che tenti di leggere č in qualche modo bloccato dal
programma che lo genera? O che mentre leggi lui tenta di scrivere e va tutto
a ramengo?
ciaociao

       End If
ottimizza un attimo, una la "&" al posto del "+" per unire le stringhe
usa Mid$ al posto di Mid
poi bho, sembra tutto ok, o ci sono linee troppo troooooooooppo lunghe o non
so che dire !
-- 
-Gigio@Work(?)-

[*Lupo* = 
LupoOrmaiR...@libero.it
 in
news:bo5ual$17tprt$
1...@ID-174464.news.uni-berlin.de
] ha scritto:
Non avendo un file di testo ampio, ho aperto e letto più volte lo stesso
file, fino a circa 10Mb
Ho provato con queste istruzioni (in coda il risultato):
    file = "C:\easywins\easywin\files\informaz\easyma.sql"
    lf = FileLen(file)
    tb = 0
    tiniz = Timer
    For n = 1 To (10 * 10 ^ 6) / lf
        canale = FreeFile
        Open file For Input Shared As #canale
        Do
            If EOF(canale) Then
                Close canale
                Exit Do
            End If
            Line Input #canale, riga
            tb = tb + Len(riga) + 2
        Loop
    Next n
    MsgBox tb & " - " & Timer - tiniz   'Circa 10Mb in 1.3 secondi (Celeron
1.06Ghz)

 wrote in message
news:bo5ual$17tprt$1...@ID-174464.news.uni-berlin.de...


 potrebbero arrivare pero' a 10.
1) il "+" per il concatenamento di stringhe è deprecato, usa "&".
2) se usi Chr$(34) ogni volta viene valutata la funzione.
Usa una variabile, la assegni all'inizio e ti sbrighi molto prima.
3) Altrettanto per la stringa di ricerca: non ha senso farla all'interno
del loop.
Probabilmente il mostruoso rallentamento è dovuto a questo,
vengono create migliaia di stringhe temporanee, e il garbage
collector suda a stargli dietro per ripulirle...
4) Che senso ha visualizzare dinamicamente all'interno di
una textbox una cosa che cambia probabilmente centinaia
di volte ? In fase di debug, capisco, ma quello rallenta già molto.
5) Cerca di dare dei nomi esplicativi alle variabili, e più diversi tra
loro, altrimenti dopo un po' ti perdi.
dimW e dimWstr sembrano fatte apposta per creare confuisione. :-)ù
6) Se ti servono delle stringhe, usa le funzioni apposta, quelle
con il $ finale, sono più veloci di quelle per le Variant. (Es.: Mid$, Mid).
Vediamo di pulire un po' il codice. Spero che la "TempLine" che
nomini in un post sia la stessa cosa della "tempstring" dell'altro. :-)
**********
Dim NomeFile as String
Dim TempLine as String
Dim FileLibero as Integer
Dim StringaDaCercare as String
Dim PosInStringa as Long
Dim NuovaStringa as String
StringaDaCercare = "setAttr " & Chr(34) & ".w" & Chr(34)
Nomefile = "quello che ti pare"
FileLibero= Freefile
Open NomeFile  For Input As #filelibero
Do while not EOF(filelibero)
Line Input #filelibero, tempLine
PosInStringa = InStr(tempLine, StringaDaCercare)
if PosInStringa Then
' queste due linee non mi sono chiare:
'         dimWstr = Mid(tempstring, dimW + 13)
 '        dimWstr = Mid(dimWstr, 1, (Len(dimWstr) - 1))
'dovrebbero poter essere tradotte così:
NuovaStringa = mid$(tempLine, PosInStringa, 12)
End If
Loop
Close #filelibero
**********
Il codice è scritto al volo, e non controllato, ma dovrebbe darti
un'idea di quello che intendo se lo leggi con calma.
Fammi sapere.
Bye, G.

 cameraTemp = Mid(tempstring, pos01 + 4, pos02 - pos01 + 4)
Che succede se pos01 e/o pos02 sono 0 oppure se pos01 è maggiore di pos02
perchè c'è un ";" prima di un "-p"?
Direi che prima di tutto può esserci un errore di logica... poi, certo, il
caricamento del combo e il continuo riposizionamento (Listindex) può
rallentare. Togli almeno il Listindex e fallo solo alla fine.

Giustissimo.... ma a mali estremi.....
Sabbahz..


 cameraTemp = Mid(tempstring, pos01 + 4, pos02 - pos01 + 4)
Sparo qualche ipotesi, trascurando un secondo il fatto che ti succede solo
sui file grossi...
l'errore che citi tipicamente lo ottieni quando uno dei due parametri
numerici del Mid e' negativo, in questo caso quindi puo' succedere quando
pos2 e' minore di pos01+4
Tiro a indovinare, ho il sospetto che il problema potrebbe essere qui:
    pos01 = InStr(tempstring, "-p")
    pos02 = InStr(tempstring, ";")
quando cioe' il carattere ";" precede o e' troppo vicino a "-p"
Gia' che ci siamo, ti interessa la posizione di questi due caratteri
partendo da inizio stringa oppure partendo dalla posizione di "Node Camera"
che hai testato subito prima? perche' se e' cosi' devi utilizzare pos come
punto di partenza per questi due InStr:
pos01 = InStr(pos, tempstring, "-p")
pos02 = InStr(pos, tempstring, ";")
Per quanto riguarda la velocita', tieni conto che se hai molte verifiche
positive, allora vengono eseguite un sacco di aggiunte e selezioni nel
ComboBox, operazioni piuttosto lente se confrontate con il resto del codice
e per di piu' aggravate da un DoEvents fatto ad ogni iterazione. In questo
caso se proprio vuoi mantenere il combo, potresti evitare del tutto di
impostare il ListIndex nel ciclo (a che serviva?) e scatenare il DoEvents
solo ogni x iterazioni, con x nell'ordine di 100
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

ok...ho trovato il misterioso mistero.
non capivo come mai il programma andasse sul mio pc, poi andavo a fare le
prove con un altro file su un altro pc e non funzionava piu' niente.r
controllavo il file incriminato sulla mia macchina e misteriosamente
funzionava.
escluse le doti di magia di xp rispetto a 2000
il misterioso mistero era che aprivo il file ASCII in wordpad per
controllare che tutto fosse ok.
poi lo chiudevo e lo salvavo.
wordpad aggiungeva la "fine della riga" in automatico.
mi e' venuto un dubbio, salvato il file dal software 3d e riaperto con
notepad,
che, come dimostrato non aveva la fine della riga.
ma un carattere a forma di quadratino.
ora la domanda e': come faccio a trovare la fine della linea ?
non mi sembra molto professionale dire di aprire il file con wordpad prima
di lanciare la mia applicazione.
:-)
ogni riga e' identificata anche da un ";"
come faccio a dire: carica il file fino al ";" e considerala come una riga.
poi passa alla successiva ?
questa volta ci vuole un miracolo ? oppure il fido vb ce la puo' fare ?
grazie ancora a tutti voi.