Direttamente a fine file?

Dovrei leggere i primi 10 caratteri dell’ultima riga di un file di
testo.
E’ possibile posizionarsi direttamente a fine file oppure devo scorrerlo
tutto?

Il giorno 18/apr/07, alle ore 10:19, Mauro S. ha scritto:

I primi 10 caratteri dell’ultima riga sono questi:

File.readlines(“filename.txt”).last[0,10]

Attenzione però perché questo metodo legge tutto il file.

Il giorno mer, 18/04/2007 alle 10.29 +0200, Giovanni I. ha scritto:

Il giorno 18/apr/07, alle ore 10:19, Mauro S. ha scritto:

I primi 10 caratteri dell’ultima riga sono questi:

File.readlines(“filename.txt”).last[0,10]

Com’e’ che non sono riuscito a trovare questo metodo last?
Dov’e’ la doc per queste cose?

Attenzione però perché questo metodo legge tutto il file.

Infatti, non c’e’ un modo per puntare direttamente a fine file?

Last è un metodo di Array. Readlines restituisce un array che
contiene tutto il file, splittato per righe. Per avere info su questi
metodi puoi usare “ri Array” e “ri File” dalla linea di comando.

c’è File#seek che ti può portare direttamente a fine file, o a n byte
dalla fine del File, ma non “all’inizio dell’ultima riga del file”.

Il giorno 18/apr/07, alle ore 10:33, Mauro S. ha scritto:

Il giorno mer, 18/04/2007 alle 10.49 +0200, Giovanni I. ha scritto:

Last è un metodo di Array. Readlines restituisce un array che
contiene tutto il file, splittato per righe. Per avere info su questi
metodi puoi usare “ri Array” e “ri File” dalla linea di comando.

c’è File#seek che ti può portare direttamente a fine file, o a n byte
dalla fine del File, ma non “all’inizio dell’ultima riga del file”.

si ho visto File#seek ma per leggere i primi n caratteri dell’ultima
riga devo conoscerne la lunghezza, siccome non posso sapere quanto sono
lunghe le singole righe del file mi sembra che la soluzione migliore sia
usare readlines.
Certo pero’ che riempirmi la memoria, il file e’ abbastanza grosso, solo
per leggere alcuni caratteri della prima e dell’ultima riga mi rompe un
po’.

Hai due strade: 1) Iterare linea per linea con File.readline oppure
2) usare seek spostandoti ad una distanza dalla fine abbastanza
generosa e poi iterare da
lì.
Sicuramente qualcuno più intelligente di me troverà una soluzione
migliore .)

Il giorno 18/apr/07, alle ore 10:58, Mauro S. ha scritto:

Magari potresti usare ´tail -n 1´? Cioè chiamare un commando shell e
prendere il pezzo che ti serve dal output…

(cmq il problema rimane: se “tail” sa trovare la fine senza tenere in
RAM tutto il file, perché Ruby e File non lo sa fare?)

Giovanni I. wrote:

contiene tutto il file, splittato per righe. Per avere info su questi
per leggere alcuni caratteri della prima e dell’ultima riga mi rompe un
http://lists.ruby-it.org/mailman/listinfo/ml


“When all you have is a hammer, everything looks like a nail”

Mauro S. [email protected] writes:

Com’e’ che non sono riuscito a trovare questo metodo last?
Dov’e’ la doc per queste cose?

File.readlines restituisce un Array, tra i metodi di un array c’é
last. Nella documentazione degli Array c’é la descrizione del metodo
last

http://www.ruby-doc.org/core/classes/Array.html#M002188

fermo restando che quando hai un oggetto obj, anche se non conosci la
sua classe (obj.class cmq) puoi sempre fare obj.methods per vedere
cosa ci puoi fare.

Infatti, non c’e’ un modo per puntare direttamente a fine file?

La classe File specializza IO. In quest’ultima trovi un po’ di metodi
di basso livello. Tralasciando il problema dei caratteri multibyte:

f = File.new(“/Users/matley/filename.txt”)

ignoriamo l’ultimo carattere perche’ potrebbe essere un newline

f.seek(-2, IO::SEEK_END)

while (f.getc.chr != “\n”)
f.seek(-2, IO::SEEK_CUR)
end
puts f.readline

secondo me, un conto è mappare un memoria un file di 100 mb
andare con il puntatore agli ultimi n byte e questo potrebbe
essere un lavoro sostanzialemente a carico del S.O.
che potrebbe essere talmente furbo da non caricare i 100 mb
ma da farlo solo on demand
in genere la gestione dei mapped file funziona così

un altro è quello di cercare le righe e questo richiede sicuramente
di leggere ogni singolo byte per individuare i new line
Ciao Paolo

+1+1 Alla soluzione di Luigi :slight_smile:

Il giorno 18/apr/07, alle ore 11:39, Luigi P. aka Matley ha
scritto: