Delphi 快速讀取TXT 指定行的數據

繼上次的問題。在提取了大量的Email 數據後。現在讀取數據成了一個問題。今天我取過1~100w的數據。明天我要取100w~200w的數據。在不用數據庫的情況下,我搞了一個下午。Delphi Tstringlist 和 textfile 的簡單讀取是滿足不了的。Tstringlist加載不了大數據。普通的textfile 讀取指定行,必須循環count到指定行。


想了一下午,然後想到另類點的解決方法。先對齊數據,每行規定一樣的長度。比如每行是 255字節。那麼100w行就是 255*100w。直接用流seek到相應位置。動手過程中,發現了更加簡單的方法。是對齊數據後,配合textfile read實現的。


定義數據結構:

type
  TEmail = packed record
    Address : string[32];
    end;

var
  MyData : file of TEmail;
  Email  : TEmail;

把TXT數據,對齊一下,按照格式生成。

procedure TForm1.btn2Click(Sender: TObject);
var
  txt:TextFile;
  str:string;
begin
  AssignFile(MyData,'NewSave.txt');
  Rewrite(MyData);
  AssignFile(txt,'saved.txt');
  Reset(txt);
  while not Eof(txt) do
  begin
    str := '';
    Readln(txt,str);
    Email.Address := str;
    write(MyData,Email);
  end;
  CloseFile(MyData);
  CloseFile(txt);
  ShowMessage('OK');
end;

然後下面是讀寫的示例:

{ 讀取指定行測試 }
procedure TForm1.btn1Click(Sender: TObject);
var
  txt:TextFile;
  str:string;
begin
  AssignFile(MyData,'NewSave.txt');
  Reset(MyData);
  Seek(MyData,StrToInt(Trim(edt1.Text)));
  Read(MyData,Email);
  ShowMessage(Email.Address);
  CloseFile(MyData);
end;

{ 讀取1萬行測試 }
procedure TForm1.btn3Click(Sender: TObject);
var
  txt:TextFile;
  str:string;
  i:Integer;
begin
  AssignFile(MyData,'NewSave.txt');
  AssignFile(txt,'10000email.txt');
  Rewrite(txt);
  Reset(MyData);
  Seek(MyData,StrToInt(edt2.Text));
  for I := StrToInt(edt2.Text) to StrToInt(edt3.Text) do
  begin
    Read(MyData,Email);
    Writeln(txt,Email.AddRess);
  end;
  CloseFile(txt);
  CloseFile(MyData);
  ShowMessage('OK');
end;


簡單粗暴 快速。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章