例:文件如下:
116 1 1 1 1 0 00000000D0000001
116 0 3 1 0 0D0000002
116 2 1 1 1 0 00000000D0000003
116,36.30803,25.72891,0.5; 1P0000001
116,37.37522,24.1529,1.33078; 3P0000002
116,38.36346,22.54986,2.20362; 5P0000003
我想提取出36.30803 25.72891 0.5
37.37522,24.1529,1.33078
38.36346,22.54986,2.20362
应该采用怎么样的方法和思路?
116 1 1 1 1 0 00000000D0000001
116 0 3 1 0 0D0000002
116 2 1 1 1 0 00000000D0000003
116,36.30803,25.72891,0.5; 1P0000001
116,37.37522,24.1529,1.33078; 3P0000002
116,38.36346,22.54986,2.20362; 5P0000003
我想提取出36.30803 25.72891 0.5
37.37522,24.1529,1.33078
38.36346,22.54986,2.20362
应该采用怎么样的方法和思路?
解决方案 »
- 有什么方法能用SHELL执行一个网页文件,但是不显示呢?
- 关于TQRChart的Print的用法 在线等
- 用代码修改SQL Server 2000身份验证模式?
- 怎么能让程序在执行时不像死机一样
- 问一单元
- 提供D5 Enterprise下载,要下的赶快行动,用Daemon打开
- 窗体问题,求救,再线等待
- 做了一个软件,在128M内存的情况下运行可以,但是在32M内存情况下就不行,我该怎么办???听说delphi有一个检测内存的软件工具,请问是
- 在EXE文件中加入WAV文件的问题!
- 请问,当Ping一个IP地址可以Ping通,但当要用以下函数取得其名称时程序却没有响应,该如何处理?
- 请推荐一个分析代码片断执行时间的工具
- 关于dbexpress的事务处理问题
如果有的话把字符串以用分号分开的切成两块如:
第一块:116,36.30803,25.72891,0.5
第二块:1P0000001
然后把第一块进行分析
用','号把字符串分成几块如:
116
36.30803
25.72891
0.5
好了再把每一个得到的字符串进行解析
现在进行解析看有没有'.'号有就保存起来!
OK
明白。
我看有没有空.
帮你写一下代码.
aa: TStringlist;
begin
aa := Tstringlist.create;
try
aa.loadfromfile('你的文件');
Showmessage(Copy(aa[6], Pos(',', aa[6]) + 1, Pos(';',aa[6]) - 1));
Showmessage(trim(Copy(aa[6], Pos(';',aa[6]) + 1, MaxInt)));
finally
aa.free;
end;
end;
var
aa: TStringlist;
begin
aa := Tstringlist.create;
try
aa.loadfromfile('你的文件');
Showmessage(Copy(aa[3], Pos(',', aa[3]) + 1, Pos(';',aa[3]) - 1));
Showmessage(trim(Copy(aa[3], Pos(';',aa[3]) + 1, MaxInt)));
finally
aa.free;
end;
end;
var
Pchar1 : pchar;
i , count : integer;
cStr : string;
begin
Count := 0;
Pchar1 := pchar(SourceStr);
cStr := '';
for i:=0 to length(Pchar1)-1 do begin
if pchar1[i] = JGZF then
begin
Count := Count + 1;
if Count = Index then begin
break;
end;
end
else if Count = Index -1 then cStr := cStr + pchar1[i];
end;
Result := cStr;
end;procedure TForm1.Button1Click(Sender: TObject);
var
list,list1 : TstringList;
i,j,index : integer;
tmp,tmp1 : string;
begin
if OpenDialog1.Execute then begin
List:=TstringList.Create;
list1:=TstringList.Create;
List.LoadFromFile(OpenDialog1.FileName);
For i:=0 to List.Count-1 do begin
index:=pos(';',list.Strings[i]);
if index>0 then begin
tmp:=copy(list.strings[i],1,index-1);
tmp:=copy(tmp,pos(',',tmp)+1,length(tmp));
tmp1:='';
For J:=1 to 3 do//这里的3表示你有几个带小数的数字.明白?
tmp1:=tmp1+GetStrForSpace(tmp,',',j)+'| ';//这里你可以更改你想要的间断符
//如把'|'改成'/'也行,其他的也行.自己在测试一下代码吧,我测试过完全没有问题. List1.add(tmp1);
End;
End;
List1.SaveToFile(OpenDialog1.FileName);
list.free;
list1.free;
End;
end;哎热死了!!!
procedure TForm1.Button1Click(Sender: TObject);
var
s,str:tstringlist; //s:用来将保存文本文件;STR,用来保存取出结果
s2 :string; //S2,用来保存S中含‘,’列取出的字符串
icount:integer;
begin
s2:='';
s:=tstringlist.Create;
str:=tstringlist.Create;
s.LoadFromFile('c:\b.txt'); //将文本文件取出到S
for icount:=0 to s.Count-1 do//对文本文件每一行进行取字串;
begin
if GetSubStr(s[icount],s2) then
str.Add(s2); //如果取出,加入到结果集STR
end;
for icount:=0 to str.Count-1 do
begin
listbox1.Items.Add(str[icount]);//将结果集体读出到列表框;
end;
end;取子川函数如下:
function TForm1.GetSubStr(ss: string;var sa:string):boolean;
var
iseof:boolean; //判断字串中是否还存在‘,’,以决定循环是否继续进行
p1,p2,i:integer;
tempstr:string;//第一次用来保存第一个逗号和最后分号间字符串,
//而后,每取一次,将已取字串截掉
resultstr:string;//用来保存结果
begin
if pos(',',ss)=0 then
begin
result:=false;
exit;
end;
resultstr:='';
result:=true;
iseof:=true; //初试化变量
p1:=pos(',',ss);
p2:=pos(';',ss);
tempstr:=copy(ss,p1+1,p2-p1+1);// 第一次取出第一个逗号和最后分号间字符串
while iseof=true do
begin
if pos(',',tempstr)=0 then //已无‘,’
begin
iseof:=false;
resultstr:=resultstr+','+tempstr;
end
else
begin
p1:=pos(',',tempstr);
IF resultstr='' then
resultstr:=copy(tempstr,1,p1-1)
else
resultstr:=resultstr+','+copy(tempstr,1,p1-1);
tempstr:=copy(tempstr,p1+1,length(tempstr)-p1-1);
end;
end; sa:=resultstr;
end;可马上测试,该函数再根据你的需求改一改,通用性应很好。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
function GetSubStr(ss: string;var sa:string):boolean;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
s,str:tstringlist; //s:用来将保存文本文件;STR,用来保存取出结果
s2 :string; //S2,用来保存S中含‘,’列取出的字符串
icount:integer;
begin
s2:='';
s:=tstringlist.Create;
str:=tstringlist.Create;
s.LoadFromFile('c:\b.txt'); //将文本文件取出到S
for icount:=0 to s.Count-1 do//对文本文件每一行进行取字串;
begin
if GetSubStr(s[icount],s2) then
str.Add(s2); //如果取出,加入到结果集STR
end;
for icount:=0 to str.Count-1 do
begin
listbox1.Items.Add(str[icount]);//将结果集体读出到列表框;
end;
end;function TForm1.GetSubStr(ss: string;var sa:string):boolean;
var
iseof:boolean; //判断字串中是否还存在‘,’,以决定循环是否继续进行
p1,p2,i:integer;
tempstr:string;//第一次用来保存第一个逗号和最后分号间字符串,
//而后,每取一次,将已取字串截掉
resultstr:string;//用来保存结果
begin
if pos(',',ss)=0 then
begin
result:=false;
exit;
end;
resultstr:='';
result:=true;
iseof:=true; //初试化变量
p1:=pos(',',ss);
p2:=pos(';',ss);
tempstr:=copy(ss,p1+1,p2-p1+1);// 第一次取出第一个逗号和最后分号间字符串
while iseof=true do
begin
if pos(',',tempstr)=0 then //已无‘,’
begin
iseof:=false;
resultstr:=resultstr+','+tempstr;
end
else
begin
p1:=pos(',',tempstr);
IF resultstr='' then
resultstr:=copy(tempstr,1,p1-1)
else
resultstr:=resultstr+','+copy(tempstr,1,p1-1);
tempstr:=copy(tempstr,p1+1,length(tempstr)-p1-1);
end;
end; sa:=resultstr;
end;end.
wdsimon(老王) 的解决方案基本也没有问题,但是这两种方法都是通过对','和";"的解析而完成的。那么如果每行需要读取字符个数不一样,这样的方法也许会存在问题。
比如说:112 1 1 1 1 0 00000000D0000001
112,36.30803,2.2,2.3,2.4,25.72891,1.0, 1P0000001
0.8.0.4,0.5,37.37522,3.5,3.8,1.3,24.1529,0.4, 3P0000002
0.9,0.5,1.33078; 5P0000003
要提取为(格式固定):
36.30803 25.72891 0.5
37.37522 24.1529 1.33078
是否应该考虑用开辟内存,也就是动态指针的方法呢?并应考虑将"P"为断句符号。由于该题一共是100分,我先付给ltysunde(@ 为要饭而....呐喊 @) 和wdsimon各25分,略表心意。剩余的讨论后再说!
再次谢谢你们!