回 帖 发 新 帖 刷新版面

主题:当读取到一个字符时,则将这一行所有程序全删除

请问一个问题,DELPHI语言的程序,实现的功能是:当读取到一个字符时,则将这一行所有程序全删除。例
 将:
 GOTO  /  -50.00000,  -10.00000
 why/    0.00100
 GOTO  /  -20.00000,  -10.00000
 where/    0.00000
 转换成:
  GOTO  /  -50.00000,  -10.00000
  GOTO  /  -20.00000,  -10.00000
  (当读到why时将所在行全删除,当读到where时将所在行全删除)

回复列表 (共19个回复)

沙发

f1,f2:textfile;//文件操作,f1为读入,f2为输出
st:string;
begin
...//初始化工作
while not eof(f1) do
begin
readln(f1,st);
if (copy(st,1,3)<>why)and(copy(st,1,5)<>where) then 
writeln(f2,st);
end;
end;

板凳

好像不太对吧

3 楼

题目不太清楚:
要不要处理每行前的空格?
关键字是否出现在每行前面?
关键字是否分大小写?

4 楼

问题描述的确不清。“当读取到一个字符时,则将这一行所有程序全删除。”----从哪里读取?是字符还是字符串?将这一行“程序”删除?

下面假设你是从TXT文本文件里读取,只要某一行有'why'或'where'这两个字符串之一,此行文本就删除,然后保存到原TXT文件中。用TStringList轻易实现(并不是说仅仅TStringList这一种方法)

procedure TForm1.Button1Click(Sender: TObject);
const
  Target1 : string = 'why';
  Target2 : string = 'where';
  fName : string = 'c:\test.txt';
var
  SS : TStringList;
  I : integer;
begin
  SS := TStringList.Create;
  SS.LoadFromFile(fName);
  for I := SS.Count-1 downto 0 do
    if (Pos(Target1, SS[I]) > 0) or (Pos(Target2, SS[I]) > 0) then
      SS.Delete(I);
  SS.SaveToFile(fName);
end;

另外,不要向个人资料里那个cool@163.com信箱写信,那个信箱是我随便写的,不是我的。幸亏你给我站内短信了,要不然你会以为我不热情.......

5 楼

写得急了,上面的代码最后少了一句:

SS.Free;

---------------------------

如果你的文本来源是一个TMemo,或者RichEdit之类的,这样:

procedure TForm1.Button2Click(Sender: TObject);
const
  Target1 : string = 'why';
  Target2 : string = 'where';
var
  SS : TStringList;
  I : integer;
begin
  SS := TStringList.Create;
  SS.Assign(Memo1.Lines);
  for I := SS.Count-1 downto 0 do
    if (Pos(Target1, SS[I]) > 0) or (Pos(Target2, SS[I]) > 0) then
      SS.Delete(I);
  Memo1.Lines.Assign(SS);
  SS.Free;
end;

6 楼

不好意思,应该是我的问题问的不清楚,意思就是:打开一个TXT文件,并使它在MEMO文框中显示,再逐行读取文件,每行都从行头开始,当在行头读取到一段特殊字符时,就将行头拥有此字符的行整行删除!
    我先试试长尾兔大哥的好不好用,谢谢了
[em2]

7 楼

不好意思,应该是我的问题问的不清楚,意思就是:打开一个TXT文件,并使它在MEMO文框中显示,再逐行读取文件,每行都从行头开始,当在行头读取到一段特殊字符时(不分大小写,行头绝对没有空格,一开始就出现特殊字符),就将行头拥有此字符的行整行删除!

8 楼

试了,挺好用,就是这样功能,谢谢大哥,你是姓李吧?

9 楼

其实是同样一个道理。
无非就是利用TStringList类以及Copy、Pos等函数而已
Memo1.Lines 恰恰就TStrings类,而TStringList也是TStrings类的派生类

const
  Target1 : string = 'why';
  Target2 : string = 'where';
  fName : string = 'c:\test.txt';
var
  I : integer;
begin
  Memo1.Lines.LoadFromFile(fName);//从TXT读到Memo1
  for I := Memo1.Lines.Count-1 downto 0 do
    if (Copy(Memo1.Lines[I], 1, Length(Target1)) = Target1)
      or (Copy(Memo1.Lines[I], 1, Length(Target2)) = Target2) then
    Memo1.Lines.Delete(I);
  Memo1.Lines.SaveToFile(fName); //再把处理后的结果存为TXT文件
end;
 

10 楼

是姓李。

问题描述清楚前,我给你的代码,是某行一旦有关键字符串,则整行删除;
问题描述清楚后,上面的代码,是从字符串的开始位置发现关键子串,则整行删除。
其实你理解一下Copy、Pos、Length这些函数就会明白。这些函数会经常用到的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册