繼上次的問題。在提取了大量的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;