2012-03-28 86 views
4

「with-open-file」將從文件的開頭讀取。如果文件非常大,如何有效地讀取最後20行?如何使用CL實現`tail`命令?

真誠!

+3

請參閱http://www.lispworks.com/documentation/lw51/CLHS/Body/f_file_p.htm – 2012-03-28 06:36:58

回答

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爲指導。