2012-03-28 17 views
4

"with-open-file"は、ファイルの先頭から読み取ります。ファイルが非常に大きい場合、最後の20行を効率よく読み取る方法は?CLを使用して `tail`コマンドを実装する方法は?

よろしくお願いいたします。

+3

http://www.lispworks.com/documentation/lw51/CLHS/Body/f_file_p.htmを参照してください。 –

答えて

6

ファイルを開き、最終バイトを読み取り、ファイルを閉じます。

(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. 

あなたが特に最後nラインを読みたい場合は、あなたがn+1改行を取得するまでのバイトの不確定数をリードバックする必要があります。これを実行するには、ブロック読み取りを逆方向に行う(高速であるが不要なバイトを読み込む)か、バイト読み取り(速度は遅くなりますが、精度とやや明白なアルゴリズムが可能です)のどちらかです。

tailはこれに合理的なアルゴリズムが適用されていると思われますので、ガイドラインとしてtailsourceを読む価値があります。

関連する問題