有500M的文件? 这样太夸张了吧 不太可能 当然,如果需要一行行的读,还是比较容易的: procedure TForm1.Button1Click(Sender: TObject); var txtStrList : TStrings; i : Integer; begin txtStrList := TStringList.Create; txtStrList.LoadFromFile('E:\Document\user.txt'); for i := 0 to txtStrList.Count - 1 do begin showmessage(txtStrList.Strings[i]); end; end;
//type // MyArrayString = array of string; function extractstrings(source:string;tag:string;var len:integer):MyArrayString; var temp:string; n,j:integer; begin n:=0; j:= Pos(tag,source); while j>0 do begin n:=n+1; setLength(result,n); temp:=copy(source,1,j-1); result[n-1]:=temp; source:=copy(source,j+1,length(source)-j); j:= Pos(tag,source); end; len:=n; end;procedure TForm1.Button1Click(Sender: TObject); var txtStrList : TStrings; i,len : Integer; tmpArray:MyArrayString; begin txtStrList := TStringList.Create; txtStrList.LoadFromFile('E:\Document\user.txt'); for i := 0 to txtStrList.Count - 1 do begin tmpArray:=extractstrings(txtstrList[i],'|',len); ... end; end;
用文件流打开,取出1M的内存作为缓存Buffer,然后打那1M Buffer的主意。Buffer的数据里,只要你遇到#13的话,你就作为下一行的标志。一行中,你只要看一下,是不是|符号,如果是,作为一个数据单元取出,该干嘛干嘛。如果Buffer的数据出现只是取得一行中的前面N个字符,已经读完,那么将那N个字符,作为Buffer的前面几个字符,然后再从文件流里是从数据是从: Buffer + N的位置开始读Loop... 如果想简单的话: var S: string; AssignFile(F, FileName); Retset(F); while not Eof do begin Readln(F, S); .... end;这样简单,速度也不会很慢。
有啥函数不将文件读入内存操作没?一行一行的读.
再用另一个stringlist,使用DelimitedText来分割一行中的各个数据。
这样太夸张了吧
不太可能
当然,如果需要一行行的读,还是比较容易的:
procedure TForm1.Button1Click(Sender: TObject);
var
txtStrList : TStrings;
i : Integer;
begin
txtStrList := TStringList.Create;
txtStrList.LoadFromFile('E:\Document\user.txt');
for i := 0 to txtStrList.Count - 1 do
begin
showmessage(txtStrList.Strings[i]);
end;
end;
// MyArrayString = array of string;
function extractstrings(source:string;tag:string;var len:integer):MyArrayString;
var
temp:string;
n,j:integer;
begin
n:=0;
j:= Pos(tag,source);
while j>0 do
begin
n:=n+1;
setLength(result,n);
temp:=copy(source,1,j-1);
result[n-1]:=temp;
source:=copy(source,j+1,length(source)-j);
j:= Pos(tag,source);
end;
len:=n;
end;procedure TForm1.Button1Click(Sender: TObject);
var
txtStrList : TStrings;
i,len : Integer;
tmpArray:MyArrayString;
begin
txtStrList := TStringList.Create;
txtStrList.LoadFromFile('E:\Document\user.txt');
for i := 0 to txtStrList.Count - 1 do
begin
tmpArray:=extractstrings(txtstrList[i],'|',len);
...
end;
end;
如果想简单的话:
var
S: string;
AssignFile(F, FileName);
Retset(F);
while not Eof do
begin
Readln(F, S);
....
end;这样简单,速度也不会很慢。
然后操作数据集就可以了。