如何读文件里的串?(50分)

  • 主题发起人 主题发起人 Hjg
  • 开始时间 开始时间
H

Hjg

Unregistered / Unconfirmed
GUEST, unregistred user!
我要从一个文件里读出信息:

序号 姓名 金额

01 Tom 00437

....
....
如何把各个字段读出来并分到变量中去?
 
文件格式?
数据库?文本?
 
建议你用Stream来做:
type
TAccount=reord
NO:integer;
Name:string[20];
Curren:integer;
.....
end;

var Account:array of TAccount;
AccFile: TFileStream;

begin
ItemCount:=....//纪录数可从一个Ini中单独读出
SetLength(Account,ItemCount);//分配
AccFile:=TFileStream.Create(AccFileName,fmOpenRead);
//AccFileName是你的数据文件名
for i:=0 to ItemCount-1 do
AccFile.ReadBuffer(Account[Count],SizeOf(TAccount));
//读完了...
//引用... Account[Number].NO, Account[Number].Name....
//存储... AccFile.WriteBuffer((Account[Count],SizeOf(TAccount));
//存储纪录数写入一个Ini ....:=ItemCount;
//释放... AccFile.Free, SetLength(Account,0);

很方便....用下标和成员访问...
 
文件格式是由你自己定还是别人的?
其实有很多方法的
比如数据库、记录文件、文本格式文件、自定义流式文件等
 
用readln函数读文件,再用pos和copy函数分离字符串。
具体用法见help file
 
var
f: file of yourtype;
//yourtype 是你的记录类型
 
我建议你把文件保存成这样的格式:

序号,姓名,金额 //用一种分隔符将字段分隔开来,就和OutLook电话簿导出的文本文件格式一样
01,Tom,00437
...
...
然后再用shangjintong的方法
用readln函数读文件,再用pos和copy函数分离字符串。
再把分离出来的字符串写入数据库或赋给变量。
我曾经写了个函数:
查找一字符串中的子字符串,并把以子字符串为分隔符的其它字符串放入TString中
function CheckSite(const Str, Ch: string
var Mystring: TStrings): boolean;
var
sit, n : integer;
S : string;
begin
Result := True;
S := Str;
n := Length(Ch);
while True do
begin
if Pos(Ch, S) = 0 then
begin
MyString.Add(S);
Break;
end;
sit := Pos(Ch, S);
MyString.Add(Copy(S, 1, sit - 1));
S := Trim(Copy(S, sit + n, Length(S)));
end;
if MyString.Count < 2 then Result := False;
end;

你可以这样做:
var
txtF : TextFile;
slTemp : TStrings;
begin
slTemp := TStringList.Creat;
if OpenDialog.Execute then
begin
if not FileExists(OpenDialog.FileName) then
begin
Application.MessageBox('文件不存在!',
'注意', MB_ICONINFORMATION + MB_OK);
Exit;
end;
AssignFile(txtF, OpenDialog.FileName);
Reset(txtF);
if ioresult <> 0 then
Readln(txtF, ReadText);
try
while not Eof(txtF) do
begin
Readln(txtF, ReadText);
if trim(ReadText) <> '' then
CheckSite(ReadText,',',slTemp);
//接下来就是把slTemp中的字符串赋给变量或数据库中,你可以自已做
end;
except

end

slTemp.Free;
txtF.Free;
...
end;

 
笨办法:用RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName)奖文件装入RicheEdit1,
再用 RichEdit1.Perform(em_setsel,i,j);//i:开始位置,j:数据长度
n:=RichEdit1.SelText;//n:string
取数据,算一下行宽,加一个循环.
 
procedure Form1.datafromtxt;
var
h,m:integer;//h:数据行宽
tofind:string;//tofind为开始取数处的字符串
i,j:array[1..3] of integer;//i,j:tofind到数据开始处距离,数据长度
n:array[1..3] of string;//保存3列数据
begin
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
if OpenDialog1.Execute then
begin
tofind:='<开始取数处的字符串>';
if mfind(tofind)=1 then
begin
j[1]:=首行第一列宽度;
j[2]:=首行第二列宽度;
j[3]:=首行第三列宽度;
i[1]:=RichEdit1.selstart;
m:=0;
while i+l_en<RichEdit1.GetTextLen do
begin
RichEdit1.Perform(em_setsel,i[1]+h*m,h*m+j[1]);
n[1]:=RichEdit1.SelText;
i[2]:=i[1]+j[1]+1;
RichEdit1.Perform(em_setsel,i[2]+h*m,i[2]+h*m+j[2]);
n[2]:=RichEdit1.SelText;
i[3]:=i[2]+j[2]+1;
RichEdit1.Perform(em_setsel,k+i[1]+k*m,k+i[1]+k*m+j[1]);
n[3]:=RichEdit1.SelText;
i[1]:=i[3]+j[3]+1;
//写入记录
m:=m+1;
end;
end;
end;
end;

function Form1.mfind(tofind:string):integer;
var
l_en,i,f_ind:integer;
begin
l_en:=length(tofind);
RichEdit1.Perform(em_setsel,0,0);
f_ind:=0;
i:=0;
while (f_ind=0) and (i+l_en<RichEdit1.GetTextLen) do
begin
RichEdit1.Perform(em_setsel,i,i+l_en);
if RichEdit1.SelText=tofind then f_ind:=1;
i:=i+1;
end;
Result:=f_ind;
end;
文本不清,无法调试.但愿能用.
 
Sorry,上次贴得太匆忙,错误太多,再贴一次:
procedure Form1.datafromtxt;
var
h,m:integer;//h:数据行宽
tofind:string;//tofind为开始取数处的字符串
i,j:array[1..3] of integer;//i,j:tofind到数据开始处距离,数据长度
n:array[1..3] of string;//保存3列数据
begin
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
if OpenDialog1.Execute then
begin
tofind:='<开始取数处的字符串>';
if mfind(tofind)=1 then
begin
h:=数据行宽;
j[1]:=首行第一列宽度;
j[2]:=首行第二列宽度;
j[3]:=首行第三列宽度;
i[1]:=RichEdit1.selstart;
m:=0;
i[3]:=0;
while i[3]+h*m+j[3]<RichEdit1.GetTextLen do
begin
RichEdit1.Perform(em_setsel,i[1]+h*m,i[1]+h*m+j[1]);
n[1]:=RichEdit1.SelText;
i[2]:=i[1]+j[1]+1;
RichEdit1.Perform(em_setsel,i[2]+h*m,i[2]+h*m+j[2]);
n[2]:=RichEdit1.SelText;
i[3]:=i[2]+j[2]+1;
RichEdit1.Perform(em_setsel,i[3]+h*m,i[3]+h*m+j[3]);
n[3]:=RichEdit1.SelText;
i[1]:=i[3]+j[3]+1;
//写入记录
m:=m+1;
end;
end;
end;
end;

function Form1.mfind(tofind:string):integer;
var
l_en,i,f_ind:integer;
begin
l_en:=length(tofind);
RichEdit1.Perform(em_setsel,0,0);
f_ind:=0;
i:=0;
while (f_ind=0) and (i+l_en<RichEdit1.GetTextLen) do
begin
RichEdit1.Perform(em_setsel,i,i+l_en);
if RichEdit1.SelText=tofind then f_ind:=1;
i:=i+1;
end;
Result:=f_ind;
end;
应没问题了.
 
多人接受答案了。
 
后退
顶部