4
"with-open-file"は、ファイルの先頭から読み取ります。ファイルが非常に大きい場合、最後の20行を効率よく読み取る方法は?CLを使用して `tail`コマンドを実装する方法は?
よろしくお願いいたします。
"with-open-file"は、ファイルの先頭から読み取ります。ファイルが非常に大きい場合、最後の20行を効率よく読み取る方法は?CLを使用して `tail`コマンドを実装する方法は?
よろしくお願いいたします。
ファイルを開き、最終バイトを読み取り、ファイルを閉じます。
(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
はこれに合理的なアルゴリズムが適用されていると思われますので、ガイドラインとしてtail
のsourceを読む価値があります。
http://www.lispworks.com/documentation/lw51/CLHS/Body/f_file_p.htmを参照してください。 –