Newsgroup: it.comp.lang.visual-basic
Titolo: Caricare lungo file

Vorrei poter caricare un file (8mb o anche piů) per poterci lavorare.
Io ho fatto una cosa con il Line Input, in modo da mettere max 1 riga in
memoria.
Sarebbe l'ideale se non fosse che il Line Input non mi legge tutto il file,
sono un pezzettino! Anzi, penso sia proprio il VB che lo vede corto, perchč
mi manda l'EOF dopo 3-4 righe di Line Input.
Io avrei bisogno di leggere il testo come lo si vede da blocco note (il file
non č un file solo testo, ma io devo lavorare con la parte testuale).
Con file (dello stesso tipo) sotto i 30-40 kb, funziona tutto: cosa posso
fare?
Aiutatemi: Come leggere dati da un file grande?
P.S. Leggendo vecchi post ho trovato il suggerimento di usare il metodo
LoadFile di RichTextBox, ma caricare 8mb in memoria mi rende il lavoro
mooolto piů lungo, e solo un Len(RichTextBox.Text) impiega una vita.
Grazie e Ciao

 lavorare.
[...]
lavorare, lavorare... sii piů specifico, che devi farci?

 memoria.
Mah il file č un file di testo, sequenziale o un file binario?


 Grazie e Ciao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:a9oe5l$4gjln$1@ID-
Citaaaaaaaaaaaaa (Quotaaaaaaaaaaaaa)!
Maledizione! non si capisce una cippa di quello che rispondi!
Ciao

 non č un file solo testo, ma io devo lavorare con la parte testuale).
Questa č la parte essenziale: il tuo file *NON* č un file di testo.
Se leggi l'help di line input (cosa che avresti dovuto fare appena ti
accorgevi che non funzionava) ti accorgerai che la line input ha dei limiti:
funziona correttamente solo con i file di testo (ti lascio alla lettura
dell'help per capire il perchč).
Ciao

 dell'help per capire il perchč).
Hai ragione, :)
Ora provo la soluzione di Fabio che mi sembra valida, e vi faccio sapere.
Grazie a tutti.

> lavorare, lavorare... sii più specifico, che devi farci?
Essenzialmente, "filtrare".
Ci sono alcune stringhe all'interno di un file *non di testo* che mi
interessano:
Con InStr le cerco e le salvo in un textbox.
Da 8mb ci ricavo circa una 30 di righe, percui è questo il motivo di files
così grossi.
P.S. Più in dettaglio: leggo un file .ses (session) di un programma per lo
scan di bachi su computer (web server). Questi non ha un utility di export
per cui leggo dal file .ses che contiene anche molte altre informazioni, gli
IP.

 riferimenti.
Ho provato: sembra non funzionare :/
Mi legge solo il testo, e non TUTTO ciň che c'č nel file.
Io ho bisogno di aprire il file come lo si apre con Blocco Note!
Il file dovrebbe essere binario, credo, ma contiene anche stringhe, NON
intervallate da NULL, e contiene caratteri sconosciuti come chr(7) come
sorta di separatori, che ovviamente il metodo ReadLine non mi legge :(((
Il metodo ReadAll funziona, ma mi legge tutto in una volta, e impiega 2-3
minuti e 95mb per caricare un file di testo di 8mb.
Help Help Help! :)

 mi manda l'EOF dopo 3-4 righe di Line Input.
    dim strStringaLunga As String
    dim FileLibero as integer
    filelibero = freefile
    open "<nome del file da aprire>" for input as #filelibero
    strStringaLunga = Input(LOF(filelibero),filelibero)
    close filelibero
A questo punto in strStringaLunga hai tutto il contenuto
del file (fino a 2 giga memoria permettendo) e ci fai quello
che ti pare.
Bye, G.
--
Le risposte alle tue domande sono sul Sito Comune
di questo NewsGroup: 
http://it-lang-vb.net/
...e nell'help in linea !

     close filelibero
Mi da Input oltre la fine del file.
Ho anche provato Input(LOF(filelibero)-1,filelibero)  , ma niente da fare
(per la cronaca, ho anche provato - 900000, sempre niente).
Se faccio Msgbox LOF(1) mi da: 8687662 (che č la dimensione in bytes del
file)

 Mi da Input oltre la fine del file.
Ops, ho riletto il 3ad... mi sa che ti tocca aprire il file for Binary
e leggere con Get, dividendo il file a blocchi.
Ricapitoliamo: hai bisogno di tutto il file in una sola stringa, giusto?
Vediamo un po':
******************************
     Dim Lunghezza As Long
     Lunghezza = FileLen("C:\windows\desktop\126.zip")
     Dim strStringaLunga As String
     Dim strStringaCorta As String * 2048
     Dim N As Long
     strStringaLunga = Space$(Lunghezza)
     Debug.Print Time$
     Dim FileLibero As Integer
     FileLibero = FreeFile
     Open "C:\windows\desktop\126.zip" For Binary As #FileLibero Len = 2048
     Do While Not EOF(FileLibero)
          Get #FileLibero, , strStringaCorta
          Mid$(strStringaLunga, (N * 2048) + 1, 2048) = strStringaCorta
          N = N + 1
     Loop
     DoEvents
     Close FileLibero
     Debug.Print Time$
' Per l'ultimo blocco, che ovviamente non quadra, compito a casa. :-)
******************************
L'ho provato con un file di 4 mega, ci ha messo un paio di secondi.
P.S.: Certo che poi, per cercare qualcosa in una stringa di 8 mega...
Bye, G.

 P.S.: Certo che poi, per cercare qualcosa in una stringa di 8 mega...
Ci mette veramente poco, per fortuna.
InStr funziona molto bene ;)
Sembra funzionare molto bene, grazie mille.
Non vedo problemi per il caricamento dell'ultimo blocco: Get recupererà una
stringa più corta di 2048, ma poi l'istruzione Mid$ (che non avevo mai
usato, usavo la funzione ma non l'istruzione, che è invece utilissima) non
ha problemi se la stringa da sostituire è più corta di 2048 (che è il valore
che gli passi come lunghezza della stringa da sostituire).
Finalmente ho risolto questo "problemone", grazie mille, ciao


Beh, a questo punto conviene creare un array di byte (o una stringa: occhio
che le stringhe VB sono Unicode e quindi un char occupa 2 byte) della
dimensione del file e pigliarlo tutto in una botta sola con Get #1, 1,
MioArray.
E' sicuramente ancora più veloce e molto più semplice.
Ciao

 E' sicuramente ancora più veloce e molto più semplice.
Si ma poi ho un array, come faccio a farci dentro un InStr? :P

 Si ma poi ho un array, come faccio a farci dentro un InStr? :P
1) Come ho detto puoi usare una stringa inizializzata:
strFile = String$(LOF(1), 0)
2) Puoi convertire l'array in stringa:
strFile = StrConv(arrByte(), vbUnicode)
Ciao

 strFile = StrConv(arrByte(), vbUnicode)
Giusto, però a questo punto faccio prima a caricarlo direttamente come
stringa :P
Comunque per ora funziona e impiega 2 secondi circa per 8mb di file, direi
che è a posto.

 strFile = StrConv(arrByte(), vbUnicode)
Vado a memoria, sono fuori sede e su questa macchina non
ho VB... ma non c'era un'istruzione InstrB ?
Bye, G.

 ho VB... ma non c'era un'istruzione InstrB ?
Si, esiste:

Ops, mi è partito un CTRL+INVIO e ha inviato il messaggio :)
Dicevo, esiste! Da MSDN:
"La funzione InStrB viene utilizzata con i dati byte contenuti in una
stringa. Anziché restituire la posizione del carattere della prima
occorrenza di una stringa all'interno di un'altra, InStrB restituisce la
posizione del byte"
Comunque per fortuna InStr di Visual Basic 6.0 è piuttosto veloce, per cui
con un'unica stringa e con ricerche all'interno di essa me la sbrigo in una
manciata di secondi.

 ha scritto nel messaggio
news:KgTv8.4032$8D3....@news1.tin.it...

Cavolo hai ragione!!