Newsgroup: it.comp.lang.delphi
Titolo: Numero di righe in un file di testo

Ciao a tutti,
  per calcolare il numero di linee in un file di testo uso
 
Linee:=0;
Assignfile(FTXT,FileName); // FTXT : FileText;
Reset(FTXT);
While not (EOF(FTXT)) Do
Begin
    ReadLn(FTXT);
    Linee := Linee + 1;
End;
 
Il file su cui lavoro e' > 200 MB per un numero di linee >2.000.000 di 
lunghezza variabile e per avere questo risultato impiega circa 18 secondi.
 
C'e' qualcosa di piu' veloce ???
 
Ho provato anche con la TStringList e prendere il TStringList.count che e' 
decisamente piu' veloce, ma (molto) spesso  durante il caricamento da 
problemi di memoria.
Su google ho trovato alcuni link di stack overflow dove indicano soluzioni 
alternative ma non attendibili (pe esempio l'uso di blokread o l'uso di 
tfliestream) in quanto il numero di linee restituite e' del 15-30% di quelle 
reali.
Inoltre, sempre su stack overflow, in un paio di link dicono che il metodo 
piu' sicuro e' quello sopra indicato.
 
Suggerimenti ?
 
Grazie
 
Ciao
 
Daniele
 

Proverei con un tmemorystream, un puntatore di byte col quale cerchi e 
conti i carratteri CR. Non usare le funzioni .read che ho trovato 
piuttosto lente rispetto un puntatore. Giorgio

 
 
Non so se è veloce, io proverei a leggere il file di testo come se fosse 
binario, leggo X bytes per volta e conto per ogni blocco quanti sono i 
caratteri di fine linea.
 
-- 
-------------------------------
per scrivere in privato
togliere "1975nosp"
 
to reply remove "1975nosp"

On 12.12.2014 18:23, Daniele wrote:> Ciao a tutti,
 >   per calcolare il numero di linee in un file di testo uso
 > [...]
 > C'e' qualcosa di piu' veloce ???
 
Ci sarebbe, se fai come suggerito, ossia gestendolo come file binario e 
contare i bytes LF che trovi.
 
Tuttavia c'è ancora un modo più veloce:
http://www.dostips.com/?t=Snippets.CountLines
 
ti salvi il cmd e lo chiami esternamente con una shellexecuteex o simili.
 
-- 
Morde

 lunghezza variabile e per avere questo risultato impiega circa 18 secondi.
 
E perche` mai vorresti caricare una tale mole di dati in memoria? 

>   per calcolare il numero di linee in un file di testo uso
 
A che scopo?
 
A.

 ti salvi il cmd e lo chiami esternamente con una shellexecuteex o simili.
 
Grazie per il link, appena possibile vedo come risolvere.
 
ciao
 
Daniele
 
 

 A che scopo?
 
Per sapere quanti record devo leggere/aggiornare.
Il file di aggiornamento arriva in formato testo, ogni linea (di lunghezza 
variabile) rappresenta un record del db.
Il primo carattere della riga indica se e' un inserimento, variazione, 
sospensione, cancellazione, sostituzione del record.
Inoltre 2 - 4 volte l'anno si fa un allineamento generale del db dal mega 
file di testo che arriva.
 
E' un dato "cosmetico" tanto per dire "record xxx di yyyy" ed aggiornare la 
barra di progresso.
 
Tutto qui, aggiungo .... dato che al massimo sono 4 aggiornamenti massicci 
annuali .... posso anche tenermi i 18 secondi !!
 
Grazie
 
ciao
 
Daniele 
 

 barra di progresso.
 
Se devi solo aggiornare una progress bar, allora puoi ottenere la dimensione del file all'inizio e impostare la progress bar, e per ogni riga che leggi calcolare il numero di byte (sara` approssimativamente il numero dei caratteri piu` uno o due - a seconda di come e` implementato il new-line - ma il dato esatto non e` importante) e aggiornare il puntatore della progress bar. Non ti serve sapere il numero di righe.