把一个文件里的第一行,和最后一行去掉,然后把之间连续超过三行的空行,替换成一行但在循环的时候,为什么报错了?
请高人指点,谢了unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons,shellapi;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
procedure SpeedButton1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure RepTxt(file1:string);
Procedure ReplaceTxt(file1:string);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.RepTxt(file1:string);
var
sl:TStringlist ;
i:Integer;
str:string;
begin
sl:=TStringList.Create;
try
sl.LoadFromFile(file1);
if checkbox1.Checked then
sl.Delete(0);
if CheckBox2.Checked then
sl.Delete(sl.Count-1); for i := 0 to sl.Count-1 do
begin
str:=IntToStr(i);
if trim(sl.Strings[i])='' then//空行
sl.Delete(i);
end;
sl.SaveToFile('C:\tmp.txt');
except
ShowMessage(str);
Free;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
end;
end;//空行操作
procedure TForm1.Button2Click(Sender: TObject);
begin
RepTxt(Trim(Edit1.Text));
end;end.
请高人指点,谢了unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons,shellapi;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
procedure SpeedButton1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure RepTxt(file1:string);
Procedure ReplaceTxt(file1:string);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.RepTxt(file1:string);
var
sl:TStringlist ;
i:Integer;
str:string;
begin
sl:=TStringList.Create;
try
sl.LoadFromFile(file1);
if checkbox1.Checked then
sl.Delete(0);
if CheckBox2.Checked then
sl.Delete(sl.Count-1); for i := 0 to sl.Count-1 do
begin
str:=IntToStr(i);
if trim(sl.Strings[i])='' then//空行
sl.Delete(i);
end;
sl.SaveToFile('C:\tmp.txt');
except
ShowMessage(str);
Free;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
end;
end;//空行操作
procedure TForm1.Button2Click(Sender: TObject);
begin
RepTxt(Trim(Edit1.Text));
end;end.
删除之后Stringlist里面的各行的序号都变了,你再循环肯定错误了,
你可以先把你找到的空行的编号记录下来,然后最后一次性删除
for i := sl.Count-1 downto 0 do
begin
str:=IntToStr(i);
if trim(sl.Strings[i])='' then//空行
sl.Delete(i);
end;
var
IsOne :Boolean;
for i := sl.Count-1 downto 0 do
begin
str:=IntToStr(i);
if trim(sl.Strings[i])='' then//空行
begin
if not IsOne then //是第一行记住,并跳过
begin
IsOne := True;
continue;
end;
sl.Delete(i);//其它行删掉
end
else
IsOne := False; //不是空行,取消记录
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
s1: TStringList;
I : Integer;
str: string;
DelAry: array of Integer;
begin
s1 := TStringList.Create;
Str:= Trim(Edit1.Text); for I := 1 to Length(Str) do {字符串第一位是#0,这里不需要}
s1.Add(str[I]); for I := s1.Count -1 downto 0 do
begin
if Trim(s1.Strings[I]) = '' then
begin
SetLength(DelAry,Length(DelAry)+1);
DelAry[High(DelAry)] := I;
end;
end; if High(DelAry) < 2 then
begin
for I := Low(DelAry) to High(DelAry) do
s1.Delete(DelAry[I]);
end else begin
I:= Low(DelAry);
while I+2 <= High(DelAry) do
begin
if (DelAry[I+1]-DelAry[I]=-1) and (DelAry[I+2]-DelAry[I+1]=-1) then
begin
s1.Delete(DelAry[I]);
S1.Delete(DelAry[I+1]);
end else begin
s1.Delete(DelAry[I]);
S1.Delete(DelAry[I+1]);
s1.Delete(DelAry[I+2]);
end;
if (I+2) = High(DelAry) then Break else I:= I+3;
end;
if I=High(DelAry) then
s1.Delete(DelAry[I]);
if I+1 = High(DelAry) then
begin
s1.Delete(DelAry[I]);
s1.Delete(DelAry[I+1]);
end;
end; Str := '';
for I := 0 to s1.Count -1 do
Str := Str + s1.Strings[I];
Edit1.Text := str ; s1.Free;
end;end.
自己瞎写个 给你参考
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
s1: TStringList;
I : Integer;
str: string;
DelAry: array of Integer;
begin
s1 := TStringList.Create;
Str:= Trim(Edit1.Text); for I := 1 to Length(Str) do {字符串第一位是#0,这里不需要}
s1.Add(str[I]); for I := s1.Count -1 downto 0 do
begin
if Trim(s1.Strings[I]) = '' then
begin
SetLength(DelAry,Length(DelAry)+1);
DelAry[High(DelAry)] := I;
end;
end; if High(DelAry) < 2 then
begin
for I := Low(DelAry) to High(DelAry) do
s1.Delete(DelAry[I]);
end else begin
I:= Low(DelAry);
while I+2 <= High(DelAry) do
begin
if (DelAry[I+1]-DelAry[I]=-1) and (DelAry[I+2]-DelAry[I+1]=-1) then
begin
s1.Delete(DelAry[I]);
S1.Delete(DelAry[I+1]);
end else begin
s1.Delete(DelAry[I]);
S1.Delete(DelAry[I+1]);
s1.Delete(DelAry[I+2]);
end;
if (I+2) = High(DelAry) then Break else I:= I+3;
end;
if I=High(DelAry) then
s1.Delete(DelAry[I]);
if I+1 = High(DelAry) then
begin
s1.Delete(DelAry[I]);
s1.Delete(DelAry[I+1]);
end;
end; Str := '';
for I := 0 to s1.Count -1 do
Str := Str + s1.Strings[I];
Edit1.Text := str ; s1.Free;
end;end.