用DELPHI该如何做 v_long:=0; v_length:=0; for i:=v_length to length(s) do begin v_str:=copy(s,pos(' ',s),length(s)); stringlist.Add(v_str); end; 我现在不知道该如何做了,请帮忙
cobi(小新国际) 你能不能说的再具体点
在<<delphi5程序人员开发指南的347页有个例子就是你的要求了,你看看
在<<delphi5程序人员开发指南的347页有个例子就是你的要求了,你看看
v_long:=0; v_length:=0; for i:=v_length to length(s)-1 do begin v_length:=pos(' ',s); v_str:=copy(s,1,v_length); v_s:=copy(s,v_length+1,length(s)-v_length); s:=v_s; showmessage(s); end;
我不知道循环该如何写 v_long:=0; v_length:=0; for i:=v_length to length(s)-1 do begin v_length:=pos(' ',s); v_str:=copy(s,1,v_length); v_s:=copy(s,v_length+1,length(s)-v_length); s:=v_s; showmessage(s); end;
还有我如何知道该TXT文件有多少行啊
读入数据的程序如下: var srcstr,tmpstr,fieldvalue : STring; i,j,k : integer; l,m : integer; begin srcstr := '姓名:张学辉 工资号:0001 单位:省局 房租:0.000 水费:54.25 电费:73.44 煤气:0.00 热水:0.000 其他:8.00 合计:135.69 房址:经三路54#北楼303# 收费单位:山东邮电 日期:09/12/2001'; for I := 0 to 11 do begin J := length(srcstr); K := pos(' ',srcstr); tmpstr := copy(srcstr,1,K); l := length(tmpstr); m := pos(':',tmpstr); fieldvalue := copy(tmpstr,m + 2 ,l - m + 1); Memo1.Lines.Add(fieldvalue); srcstr := copy(srcstr,K + 1,J - K + 1); end; l := length(srcstr); m := pos(':',srcstr); fieldvalue := copy(srcstr,m + 2,l - m + 1); Memo1.Lines.Add(fieldvalue); end;其中需要注意的是: 1.循环要做12次,但是有13个字段,因为最后一个值时已经没有‘ ’了,所以要单独在循环外处理; 2.你的分隔符‘:’,我不知道你在txt中是中文的冒号还是英文的冒号,前者按程序中所做,后者,则fieldvalue := copy(tmpstr,m + 2 ,l - m + 1);改为 fieldvalue := copy(tmpstr,m + 1 ,l - m + 1);这是因为中文冒号占两个长度,英文的占一个。 至于你的文件有多少行,可以在读取文件时读出。如果是text文件,可以使用memo.lines.loadfromfile 取得整个文件内容,而当内部一行为一条记录时,memo.lines.count + 1就是记录的条数。用这中读取方法比较好用
再读文本文件时可以用StringList.LoadFromFile(FileName);
if Open_file.Execute=true then begin assignfile(f,open_file.FileName); reset(f); readln(f,s); memo1.Lines.loadfromfile(s); closefile(f); end; showmessage(inttostr(memo1.Lines.count)); for j:=0 to memo1.Lines.Count-1 do begin for i:=0 to Dbg_Fzx.Columns.Count-1 do begin v_length:=pos(' ',s); v_str:=copy(s,1,v_length); v_value:=copy(v_str,pos(':',v_str)+1,length(v_str)-pos(':',v_str)); if i=0 then begin v_bh:=v_value; end; qry_auto.Close; qry_auto.SQL.text:='update fzx_xxb set '+Dbg_Fzx.Columns[i].FieldName +'='''+trim(v_value)+''' where bh='''+v_bh+''''; qry_auto.ExecSQL; v_s:=copy(s,v_length+1,length(s)-v_length); s:=v_s; end; end; 小新国际你看我这边那有错,怎么我LOADFROMFILE可以,但是showmessage(inttostr(memo1.Lines.count));出错
我为你做了一个通用函数,我觉得更方便,更容易维护:function SeperateString(var AList:TStringList; AString:AnsiString; ASeprator:string):integer ; var iLenOfSeprator,iPos:integer; strItem:AnsiString; begin iLenOfSeprator:=Length(ASeprator); iPos:=Pos(ASeprator,AString); while iPos>0 do begin strItem:=Copy(AString,1,iPos-1); Delete(AString,1,iPos+iLenOfSeprator-1); AList.Add(strItem); iPos:=Pos(ASeprator,AString); end; AList.Add(AString); Result:=AList.Count ; end; procedure TForm1.Button3Click(Sender: TObject); var f:textfile; i:integer; s:string; vList,vSubList:TStringList; begin if not dlgopen.Execute then Exit; vList:=TStringList.Create; vSubList:=TStringList.Create; AssignFile(f,dlgopen.FileName); Reset(f); while not eof(f) do begin Readln(s); vList.Clear; SeperateString(vList,s,' '); Table1.Edit; for i:=0 to vList.Count -1 do begin vSubList.Clear; SeperateString(vSubList,vList.Strings[i],':'); vList.Strings[i]:=vSubList.Strings[1]; end; Table1.FieldByName('姓名').AsString :=vList.Strings[0]; Table1.FieldByName('工资号').AsString :=vList.Strings[1]; Table1.FieldByName('单位').AsString :=vList.Strings[2]; Table1.FieldByName('房租').AsFloat :=StrToFloat(vList.Strings[3]); //....... //添加所有需要的字段 Table1.Post; end; CloseFile(f); end;
例如:
srcstr := 'xxx' --每行的内容
tmpstr := copy(srcstr,1,length(srcstr) - pos(' ',srcstr)); --取出姓名
table1.fieldbyname('姓名').asstring := copy(tmpstr,pos(':',tmpstr),length(tmpstr) - pos(':',tmpstr)); -- 写入数据库因为包含多个字段,所以上面的操作实际应当运用循环完成;为了使循环能顺利进行,对srcstr、tmpstr的控制比较重要;当然还要考虑到字段值为空的情况。
v_long:=0;
v_length:=0;
for i:=v_length to length(s) do
begin
v_str:=copy(s,pos(' ',s),length(s));
stringlist.Add(v_str);
end;
我现在不知道该如何做了,请帮忙
v_length:=0;
for i:=v_length to length(s)-1 do
begin
v_length:=pos(' ',s);
v_str:=copy(s,1,v_length);
v_s:=copy(s,v_length+1,length(s)-v_length);
s:=v_s;
showmessage(s);
end;
v_length:=0;
for i:=v_length to length(s)-1 do
begin
v_length:=pos(' ',s);
v_str:=copy(s,1,v_length);
v_s:=copy(s,v_length+1,length(s)-v_length);
s:=v_s;
showmessage(s);
end;
var
srcstr,tmpstr,fieldvalue : STring;
i,j,k : integer;
l,m : integer;
begin
srcstr := '姓名:张学辉 工资号:0001 单位:省局 房租:0.000 水费:54.25 电费:73.44 煤气:0.00 热水:0.000 其他:8.00 合计:135.69 房址:经三路54#北楼303# 收费单位:山东邮电 日期:09/12/2001';
for I := 0 to 11 do
begin
J := length(srcstr);
K := pos(' ',srcstr);
tmpstr := copy(srcstr,1,K);
l := length(tmpstr);
m := pos(':',tmpstr);
fieldvalue := copy(tmpstr,m + 2 ,l - m + 1);
Memo1.Lines.Add(fieldvalue);
srcstr := copy(srcstr,K + 1,J - K + 1);
end; l := length(srcstr);
m := pos(':',srcstr);
fieldvalue := copy(srcstr,m + 2,l - m + 1);
Memo1.Lines.Add(fieldvalue);
end;其中需要注意的是:
1.循环要做12次,但是有13个字段,因为最后一个值时已经没有‘ ’了,所以要单独在循环外处理;
2.你的分隔符‘:’,我不知道你在txt中是中文的冒号还是英文的冒号,前者按程序中所做,后者,则fieldvalue := copy(tmpstr,m + 2 ,l - m + 1);改为
fieldvalue := copy(tmpstr,m + 1 ,l - m + 1);这是因为中文冒号占两个长度,英文的占一个。
至于你的文件有多少行,可以在读取文件时读出。如果是text文件,可以使用memo.lines.loadfromfile 取得整个文件内容,而当内部一行为一条记录时,memo.lines.count + 1就是记录的条数。用这中读取方法比较好用
begin
assignfile(f,open_file.FileName);
reset(f);
readln(f,s);
memo1.Lines.loadfromfile(s);
closefile(f);
end;
showmessage(inttostr(memo1.Lines.count));
for j:=0 to memo1.Lines.Count-1 do
begin for i:=0 to Dbg_Fzx.Columns.Count-1 do
begin
v_length:=pos(' ',s);
v_str:=copy(s,1,v_length);
v_value:=copy(v_str,pos(':',v_str)+1,length(v_str)-pos(':',v_str));
if i=0 then
begin
v_bh:=v_value;
end;
qry_auto.Close;
qry_auto.SQL.text:='update fzx_xxb set '+Dbg_Fzx.Columns[i].FieldName
+'='''+trim(v_value)+''' where bh='''+v_bh+'''';
qry_auto.ExecSQL;
v_s:=copy(s,v_length+1,length(s)-v_length);
s:=v_s;
end; end;
小新国际你看我这边那有错,怎么我LOADFROMFILE可以,但是showmessage(inttostr(memo1.Lines.count));出错
AString:AnsiString; ASeprator:string):integer ;
var
iLenOfSeprator,iPos:integer;
strItem:AnsiString;
begin
iLenOfSeprator:=Length(ASeprator);
iPos:=Pos(ASeprator,AString);
while iPos>0 do
begin
strItem:=Copy(AString,1,iPos-1);
Delete(AString,1,iPos+iLenOfSeprator-1);
AList.Add(strItem);
iPos:=Pos(ASeprator,AString);
end;
AList.Add(AString);
Result:=AList.Count ;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
f:textfile;
i:integer;
s:string;
vList,vSubList:TStringList;
begin
if not dlgopen.Execute then Exit;
vList:=TStringList.Create;
vSubList:=TStringList.Create;
AssignFile(f,dlgopen.FileName);
Reset(f);
while not eof(f) do
begin
Readln(s);
vList.Clear;
SeperateString(vList,s,' ');
Table1.Edit;
for i:=0 to vList.Count -1 do
begin
vSubList.Clear;
SeperateString(vSubList,vList.Strings[i],':');
vList.Strings[i]:=vSubList.Strings[1];
end;
Table1.FieldByName('姓名').AsString :=vList.Strings[0];
Table1.FieldByName('工资号').AsString :=vList.Strings[1];
Table1.FieldByName('单位').AsString :=vList.Strings[2];
Table1.FieldByName('房租').AsFloat :=StrToFloat(vList.Strings[3]);
//.......
//添加所有需要的字段
Table1.Post;
end;
CloseFile(f);
end;