2016-08-27

【Delphi】文字檔的處理 -- 讀出大文字檔的最後一行

參考資料 ----
Seek


這篇筆記的起因是為了要 快速讀出  一個 700M 的純文字檔的最後一行,適用 Delphi7

方法一:

以開純文字檔的方式,一次讀一行,循序讀到最後一行大約耗時 10 秒,還可接受。
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
    myfile: TextFile;
    s: string;
begin
    memo1.clear;

    memo1.Lines.Add('start: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
    AssignFile(myfile, 'demo.txt');
    Reset(myfile);

    while not EOF(myfile) do
    begin
        ReadLn(myfile,s);
    end;
    memo1.Lines.Add(s);

    CloseFile(myfile);
    memo1.Lines.Add('stop: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
end;
 

方法二:

在確定特定檔案格式的前提開啟檔案,可透過 seek 指令,將檔案指標移到指定位置。
 
procedure TForm1.btnSeekClick(Sender: TObject);
var
    myWord: char;
    myFile : File of char;    // 檔案為字元格式
    iPos: Longint;
    str: string;
begin
    memo1.Clear;

    // 以唯讀模式開啟檔案
    AssignFile(myFile, 'demo.txt');
    Reset(myFile);

    // 取得檔案最末 50 個字元的文字指標位置
    iPos := FileSize(myfile) - 50;
    // 直接移動文字指標目的地
    Seek(myFile, iPos);

    // 一次讀一個字元, 並存入 str, 直至檔案末
    while not EOF(myfile) do
    begin
        Read(myFile, myWord);
        str := str + myWord;
        Inc(iPos);
        Seek(myFile, iPos);
    end;

    memo1.Lines.Add(str);

    // 關閉檔案
    CloseFile(myFile);

end;