2016-08-27

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

參考資料 ----
Seek


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

方法一:

以開純文字檔的方式,一次讀一行,循序讀到最後一行大約耗時 10 秒,還可接受。
  1.  
  2. procedure TForm1.BitBtn1Click(Sender: TObject);
  3. var
  4. myfile: TextFile;
  5. s: string;
  6. begin
  7. memo1.clear;
  8.  
  9. memo1.Lines.Add('start: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
  10. AssignFile(myfile, 'demo.txt');
  11. Reset(myfile);
  12.  
  13. while not EOF(myfile) do
  14. begin
  15. ReadLn(myfile,s);
  16. end;
  17. memo1.Lines.Add(s);
  18.  
  19. CloseFile(myfile);
  20. memo1.Lines.Add('stop: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
  21. end;
  22.  

方法二:

在確定特定檔案格式的前提開啟檔案,可透過 seek 指令,將檔案指標移到指定位置。
  1.  
  2. procedure TForm1.btnSeekClick(Sender: TObject);
  3. var
  4. myWord: char;
  5. myFile : File of char; // 檔案為字元格式
  6. iPos: Longint;
  7. str: string;
  8. begin
  9. memo1.Clear;
  10.  
  11. // 以唯讀模式開啟檔案
  12. AssignFile(myFile, 'demo.txt');
  13. Reset(myFile);
  14.  
  15. // 取得檔案最末 50 個字元的文字指標位置
  16. iPos := FileSize(myfile) - 50;
  17. // 直接移動文字指標目的地
  18. Seek(myFile, iPos);
  19.  
  20. // 一次讀一個字元, 並存入 str, 直至檔案末
  21. while not EOF(myfile) do
  22. begin
  23. Read(myFile, myWord);
  24. str := str + myWord;
  25. Inc(iPos);
  26. Seek(myFile, iPos);
  27. end;
  28.  
  29. memo1.Lines.Add(str);
  30.  
  31. // 關閉檔案
  32. CloseFile(myFile);
  33.  
  34. end;
  35.