Ciao,
devo leggere un file testuale, per estrarre delle informazioni che so trovarsi sull'ultima riga, dato che questo file tendera a crescere col tempo, come posso aprire a saltare all'ultima riga senza scandire tutto il file???
Grazie
Ciao,
devo leggere un file testuale, per estrarre delle informazioni che so trovarsi sull'ultima riga, dato che questo file tendera a crescere col tempo, come posso aprire a saltare all'ultima riga senza scandire tutto il file???
Grazie
se intendi andare all'ultima riga in senso proprio e' possibile solo se le righe hanno lunghezza fissa. In tal caso puoi usare la funzione seek.
Altrimenti vi sono vari sistemi per scorrere un file senza caricarlo in RAM tutto
Marco Allegretti
shishii@tiscalinet.it
Lang: PERL, PHP, SQL.
Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips
per ora ho risolto cosi:
open(FILE, "<file")
flock(FILE,2)
@dump = <FILE>
flock(FILE,8)
close(FILE)
$lat = $dump[@dump-1];
undef(@dump)
non e il massimo, ma per ora mi e venuta questa in mente
purtroppo le righe non sonoa lunghezza fissa, variano!
mi sai redirigere su dove trovare info su come leggere senza caricare in memoria??? a livello di prestazioni degrada?
Grazie
uhm....
Che ne dici di un:
codice:open(FILE, "<file") flock(FILE,2) seek(FILE,-150,2); # Sposti il cursore a 150 caratteri prima della file del file @dump = <FILE> flock(FILE,8) close(FILE) $lat = $dump[@dump-1]; # Puoi scriverlo come $last=pop(@dump); undef(@dump)
con seek(FILE,-150,2); sposti il cursore prima di 150 caratteri dalla fine del file.
Quando vai ad inserire tutto nel vettore inserirà solo le righe successive al cursore. In questo modo farai un dump del file molto piccolo.
Puoi evitare di usare il vettore nel seguente modo:
se la lunghezza delle righe è maggiore di 150 aumenti il valore di spostamento.codice:open(FILE, "<file") flock(FILE,2) seek(FILE,-150,2); $last=$_ while <FILE>; # in $last avrai l'ultima riga flock(FILE,8) close(FILE)
Ciao
...
carina come idea, ma non me la fido, se per qualche strano motivo la riga cambia dimensione va tutto all'aria
Dati per semplificare (non ci avevo pensato prima!) metto un estratto del file.
Per chi non lo conosce è il file index.txt di una CA creata con openssl, ogni riga rappresenta un certificato firmato dalla CA, io devo estrarre per l'ultima riga la 3 colonna che è il serial del certificato.
codice:V 110604175501Z 94C492A5C2F83A75 unknown /emailAddress=email/C=IT/ST=Italia/L=Milano/OU=Spektra Group/O=ISU/CN=Nome 1 V 110604175510Z 94C492A5C2F83A76 unknown /emailAddress=email/C=IT/ST=Italia/L=Milano/OU=Spektra Group/O=ISU/CN=Nome 2 V 110604175513Z 94C492A5C2F83A77 unknown /emailAddress=email/C=IT/ST=Italia/L=Milano/OU=Spektra Group/O=ISU/CN=Nome 3 V 110604175516Z 94C492A5C2F83A78 unknown /emailAddress=email/C=IT/ST=Italia/L=Milano/OU=Spektra Group/O=ISU/CN=Nome 4
Ciao,
ho letto rapidamente il thread quindi mi posso essere perso qualcosa...
Ma se:
lavori sotto linux o unix
il campo di interesse è sempre nella stessa posizione
puoi richiamare il seguente comando di sistema:
dove:codice:tail -1 nomefile.est | cut -f4
tail -1 nome file.est ti estrae direttamente l'ultima riga
cut -f4 ti estrae il quarto campo. In quanto dall'esempio che hai postato sembrerebbe essere il quarto campo a contenente l'ID del certificato e non il 3.
Facendo un
ottenevo uno spazio e non l'ID del certificato.codice:tail -1 nomefile.est | cut -f3
Spero di essere stato chiaro ed utile.
ciao,
luxxa
buona idea, anche se volevo evitare di eseguire comandi!
grazie