利用Tstringlist删除文件中有‘ 4 1’,‘RINEX FILE SPLICE; other post-header comments skipped COMMENT’的行,空白处为空格符。
代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var
s:tstrings;
num,pos1,pos2:integer;
begin
s:=tstringlist.create;
s.loadfromfile('c:\usno.06o');
for num:=0 to s.count-1 do
begin
pos1:=pos(' 4 1',s[num]);
pos2:=pos('RINEX FILE SPLICE; other post-header comments skipped COMMENT',s[num]);
if pos1>0 then
s.Delete(num);
if pos2>0 then
s.Delete(num);
s.SaveToFile('c:\1.06o');
end;
end;
在执行中出错提示'list index out of bounds (48410)',此文件一共48432行。
本以为是超出了列表行数,但不作删除操作,把这些内容放在memo里都能正常显示出来,所以觉得还不是超出原因,可以是出在删除操作上了,请大家帮我看看是哪里出错,另外觉得这种方法操作文件有点慢,有没有什么好的方法,大家指点一下,万分感谢。。
代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var
s:tstrings;
num,pos1,pos2:integer;
begin
s:=tstringlist.create;
s.loadfromfile('c:\usno.06o');
for num:=0 to s.count-1 do
begin
pos1:=pos(' 4 1',s[num]);
pos2:=pos('RINEX FILE SPLICE; other post-header comments skipped COMMENT',s[num]);
if pos1>0 then
s.Delete(num);
if pos2>0 then
s.Delete(num);
s.SaveToFile('c:\1.06o');
end;
end;
在执行中出错提示'list index out of bounds (48410)',此文件一共48432行。
本以为是超出了列表行数,但不作删除操作,把这些内容放在memo里都能正常显示出来,所以觉得还不是超出原因,可以是出在删除操作上了,请大家帮我看看是哪里出错,另外觉得这种方法操作文件有点慢,有没有什么好的方法,大家指点一下,万分感谢。。
解决方案 »
- Delphi如何实现类型于工具箱的树形结构
- 各位老大,请解决这个问题~
- 请教几个C/S结构程序的布署问题,能帮忙回几个是几个!谢谢!
- MDI 问题
- 怎么读取一个表中的所有字段名,或者说怎样知道一个字段在不在这个表中呢?
- ***请问如何调用父类中的方法与变量***
- 如何直接从DBGrid控件中获得当前记录是第几条记录?而不采用query和table控件
- cxDBImagecombobox文字靠某边放置
- ????快帮帮忙吧,一个有关打印的问题!?????
- 如何判断是否上网,如果没有上网,不会引起自动拨号!谢了
- 如何将一个组件的一些属性封装为 DLL 给别人使用?
- 怎样让电脑自动读出金额,在线等,高手进,....
if pos1>0 or pos2>0 then
s.delete(num);
在这样写的时候总是编译不过,不知道是为什么。。
~~~~~~~~~~~~~~~~~~~
类似 这样在List类里删除某行的循环,一般要用DownTo处理:for num := s.count-1 to 0 do ...
s : TStringList ;
num,pos1,pos2 : integer;
begin
s := TStringList.Create;
s.Loadfromfile('c:\usno.06o');
for num := s.count-1 DownTo 0 do
begin
pos1:=pos(' 4 1',s[num]);
pos2:=pos('RINEX FILE SPLICE; other post-header comments skipped COMMENT',s[num]);
if pos1>0 then s.Delete(num);
if pos2>0 then s.Delete(num);
end;
s.SaveToFile('c:\1.06o');
s.Free;
end;
s : TStringList ;
begin
s := TStringList.Create;
s.Loadfromfile('c:\usno.06o');
StringReplace(s.text,' 4 1','',[rfReplaceAll]);
StringReplace(s.text,'FILE SPLICE; other post-header comments skipped COMMENT','',[rfReplaceAll]);
s.SaveToFile('c:\1.06o');
s.Free;
end;
if pos1>0 or pos2>0 then
s.delete(num);
在这样写的时候总是编译不过,不知道是为什么。。
------------------------------------------------
因为 > 的优先级要低于 or 运算,所以,改成这样就可以:
if (pos1>0) or (pos2>0) then
s.delete(num);
况且wywry的方法需要改一下: (添加s.text := 部分)
var
s : TStringList ;
begin
s := TStringList.Create;
s.Loadfromfile('c:\usno.06o');
s.text := StringReplace(s.text,' 4 1','',[rfReplaceAll]);
s.text := StringReplace(s.text,'FILE SPLICE; other post-header comments skipped COMMENT','',[rfReplaceAll]);
s.SaveToFile('c:\1.06o');
s.Free;
end;{ 删除相应的子串,但没有删除该行(保留空行) }参考:http://community.csdn.net/Expert/topic/5253/5253038.xml?temp=4.920596E-02
s : TStringList ;
begin
s := TStringList.Create;
s.Loadfromfile('c:\usno.06o');
s.text := StringReplace(s.text,' 4 1'+#13+#10,'',[rfReplaceAll]);
s.text := StringReplace(s.text,'FILE SPLICE; other post-header comments skipped COMMENT'+#13+#10,'',[rfReplaceAll]);
s.SaveToFile('c:\1.06o');
s.Free;
end;{ 但总是感觉不踏实,因为,有这种可能:只有换行符,没有回车符 }