如何将文本中的内容读入变量中(200分)

  • 主题发起人 主题发起人 tangqi
  • 开始时间 开始时间
T

tangqi

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将文本文件中冒号间的内容读入变量中
00:DACPAS:DANGEROUS CARGO PASS:9:002403081b:receiver:200606051425'
10:EQXG::伊朗法罕:IRAN ISFAHAN:477W:161:E'
 
先读到Tstringlist 然后用pos和copy这两个函数分析 赋值给变量就行。
 
var
FStrList : TStringList;

FStrList := TStringList.Create;
try
FStrList.LoadFromFile('c:/temp.txt');
... ...(遍历等操作)
finally
FStrList.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
filename,str:string;
begin
listbox1.Items.LoadFromFile('D:/123.txt');
for i:=0 to listbox1.Items.Count-1 do
begin
filename:=listbox1.Items;
for j:=1 to length(filename) do
begin
if pos(':',filename)>0 then
begin
str:=copy(filename,1,pos(':',filename)-1) ;
filename:=copy(filename,pos(':',filename)+1,length(filename)-pos(':',filename));
showmessage(str);
end
else str:=filename;
end;
showmessage(str);
end;
end;
 
如何分割文本文件我是清楚了,但是我还有个问题,如何将冒号间的内容分别读到不同的变量中去,比如A=00,B=DACPAS,C=DANGEROUS CARGO PASS以此类推下去。请各位大侠相助。
 
你可以这样处理。
tstr:='00:DACPAS:DANGEROUS CARGO PASS:9:002403081b:receiver:200606051425';
如果是固定长度,你就直接数位数。
a:=copy(tstr,1,2);b:=copy(tstr,4,6);.....
如果只是使用“:”分格,你就这样做。
a:=copy(tstr,1,pos(':',tstr)-1);
tstr:=copy(tstr,pos(':',tstr)+1);//去掉前面已经取出的数据。
b:=copy(tstr,1,pos(':',tstr)-1);
tstr:=copy(tstr,pos(':',tstr)+1);//去掉前面已经取出的数据。
//就这样一直下去,到你取出全部数据
 
来迟了,顶一下把,更支持zywcd的做法.
 
或者当SL:TStringList;
A:=SL[0];
B:=SL[1];
C:=SL[2];
...
 
感谢各位大力支持,我明白了
 
先读入到TSTRINGLIST中,然后一行一行地按分号拆开。
我有一个函数,是拆分字符串为STRINGLIST的。
function TForm1.StringByCharToStringList(SourceChar,
ByChar: string): TStringList;
var
i,j,k : integer;
LeftStr,RightStr : string;
begin
Result := TstringList.Create;
SourceChar := Trim(SourceChar);
k := Pos(ByChar,SourceChar);
if k = 0 then
begin
Exit;
end;
LeftStr := Copy(SourceChar,1,k - 1);
RightStr := Copy(SourceChar,k+1,Length(SourceChar) - k);
Result.Add(LeftStr);
while (Pos(ByChar,RightStr) > 0) do
begin
k := Pos(ByChar,RightStr);
LeftStr := Copy(RightStr,1,k - 1);
RightStr := Copy(RightStr,k+1,Length(RightStr) - k);
Result.Add(LeftStr);
end;
if RightStr <> '' then
begin
Result.Add(RightStr);
end;
end;
 
我想问一下zywcd,tstr:=copy(tstr,pos(':',tstr)+1);//去掉前面已经取出的数据。
这句好像有点问题,程序中报错[Error] Unit1.pas(42): Incompatible types;[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'这是什么原因呢?请答复!
 
最简单的办法,就是用tstringlist的DelimitedText&delimiter方法,不需要你去分割字符串,你在一搜索就明白了.
 
少了一个参数 tstr:=copy(tstr,pos(':',tstr)+1,length(tstr));
 
对,楼上是对的。我少输入了截取的字符长度。
呵呵,没有测试的代码,只有把想法写出来了。
 
我自己试过的用分隔符分割文本的最好的方法:
function GetDelimiteredStringN(Astring:String;Dlmter:Char;nPos:integer):string;
var
sList:TStringList;
begin
Result:='';
sList:=TStringList.Create;
sList.Text:=StringReplace(Astring,Dlmter,#13#10,[rfReplaceAll]);
if (nPos>0) and (sList.Count>=nPos) then Result:=sList[nPos-1];
end;

其中Astring是你要分割的字串
Dlmter为分隔符
nPos是想取第几个分隔符之前的字串
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
860
SUNSTONE的Delphi笔记
S
S
回复
0
查看
785
SUNSTONE的Delphi笔记
S
后退
顶部