2012-03-28 4 views
4

"with-open-file" liest vom Anfang einer Datei. Wenn die Datei sehr groß ist, wie können die letzten 20 Zeilen effizient gelesen werden?Wie implementiert man den Befehl "tail" mit CL?

Mit freundlichen Grüßen!

+3

siehe http://www.lispworks.com/documentation/lw51/CLHS/Body/f_file_p.htm –

Antwort

6

Dies öffnet eine Datei, liest das letzte Byte und schließt die Datei.

(defun read-final-byte (filename) 
    (with-open-file (s filename 
        :direction :input 
        :if-does-not-exist :error) 
    (let ((len (file-length s))) 
     (file-position s (1- len)) ; 0-based position. 
     (read-char s nil))))  ; don't error if reading the end of the file. 

Wenn Sie speziell die letzten n Zeilen lesen möchten, erhalten Sie eine unbestimmte Anzahl von Bytes lesen zurück, bis Sie n+1 Zeilenumbrüche erhalten. Um dies zu tun, müssen Sie entweder Block-Reads rückwärts (schneller, wird aber beim Lesen nicht benötigter Bytes enden) oder Byte-Reads (langsamer, ermöglicht aber Präzision und einen etwas offensichtlicheren Algorithmus).

Ich vermute, tail hat einen vernünftigen Algorithmus für diese angewendet, so wäre es wahrscheinlich wert tail 's source für eine Richtlinie zu lesen.

Verwandte Themen