查找替换大段文本???~~(50分)

  • 主题发起人 主题发起人 江小流
  • 开始时间 开始时间

江小流

Unregistered / Unconfirmed
GUEST, unregistred user!
有上千个文本文件,里面都有相同的一段文字,现在程序要把这些文件中的这段文字替换成另外一段文字。如何。
我的程序:
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
str1,str2,pathstr : String;
List : TStringList;
begin

str1 :=Edit1.Text ; //要被替换的字符串
str2 := Edit2.Text; //要替换成的字符串
OpenDialog1.Execute;
pathstr := OpenDialog1.FileName; //文本文件路径及文件名.
// ShowMessage(pathstr);
List := TStringList.Create;
List.LoadFromFile( pathstr );
for i := 0 to List.Count - 1 do
list := stringreplace(List,str1,str2,[rfReplaceAll]);
List.SaveToFile( Pathstr );
List.free;
end;
用EDIT控件,只能替换一行,换成RECHEDIT或MEMO又不行
 
//*******************
//说明:字符串的查找替换
//参数:S 原文本
// Srch 查找文本
// Replace 替换文本
//*******************
function ReplaceStr(const S, Srch, Replace: AnsiString): AnsiString;
var
I: Integer;
Source: Ansistring;
begin
Source := S;
Result := '';
repeat
I := Pos(Srch, Source);
if I > 0 then begin
Result := Result + Copy(Source, 1, I - 1) + Replace;
Source := Copy(Source, I + Length(Srch), MaxInt);
end
else Result := Result + Source;
until I <= 0;
end;
 
我这里也有一个,自己经常用的
//filename:文件名
//searchstring:查找字符串
//replacestring:替换字符串

//字符串替换
procedure FileReplaceString(const FileName,searchstring,replacestring:string);
var
fs:tFileStream;
S:string;
begin
fs:=tFileStream.Create(FileName,fmOpenread or fmShareDenyNone);
try
SetLength(S,fs.Size);
fs.ReadBuffer(S[1],fs.Size);
finally
fs.Free;
end;
S:=stringReplace(S,searchString,replaceString,[rfReplaceAll,rfIgnoreCase]);
fs:=tFileStream.Create(FileName,fmCreate);
try
fs.WriteBuffer(S[1],length(S));
finally
fs.Free;
end;
end;
 
不是字符串,是大段文本。??
 
To 楼主
你上面那位写得好, 比如这样的文本:
abcdef
efgaasdgfasdf
dsafsadfasdf

用字符串替换就是:
abcdef#13#10efgaasdgfasdf#13#10dsafsadfasdf#13#10
 
我把文件读入到隐藏的MEMO中,因为有大批的文件处理,而且每个文件被替换部分虽然文字相同,但是空行的数量可能不同,这样,替换的时候就认为是不一样的段落,现在我想把MEMO中为空的行删除掉,这样格式就统一了,再对MEMO内容替换。
谢谢各位大侠,还有问题就是,这些文件在不同的文件夹中,也可能是多级文件夹,后缀为
.JSP。用FINDFIRST,FINDNEXT函数?如何处理多级文件夹问题?呵呵,我比较懒,解决了,我可以加分
 
解决了,我的代码,函数名称驴唇不对马嘴;),平均发分,不偏不向,哥儿几个买糖吃:
function isfile(dir:string):boolean;
var
SelPos: Integer;
pathstr:string;
i:integer;
F : TSearchRec;
Found : Boolean ;

begin
RESULT:=FALSE;
Found:=(FindFirst('*.*',faAnyFile,f)=0);
while (FINDNEXT(F)=0) do ///////
begin ///////
if (F.Attr=faDirectory) THEN
if (F.Name<>'.')AND(F.Name<>'..') then
begin
Dir:=ExpandFileName(f.Name);
ChDir(dir);
isfile(dir);
ChDir('..');

end
else

ELSE if F.Attr=faArchive then
begin
pathstr:=dir+'/'+F.Name;
with FORM1.ReplaceDialog1 do
begin
findtext:=Form1.Memo2.Lines.Text;
ReplaceText:=Form1.Memo3.Lines.Text;
FORM1.Memo1.Lines.LoadFromFile(pathstr);
i:=FORM1.Memo1.Lines.Count;
while i>=0 do
begin
if FORM1.Memo1.Lines='' then
begin
FORM1.Memo1.Lines.Delete(i);
i:=i-1;
end
else
i:=i-1
end;

SelPos := Pos(FindText, FORM1.Memo1.Lines.Text);
if SelPos > 0 then
begin
FORM1.Memo1.SelStart := SelPos - 1;
FORM1.Memo1.SelLength := Length(FindText);
FORM1.Memo1.SelText := ReplaceText;
FORM1.Memo1.Lines.SaveToFile(pathstr);
FORM1.Memo1.Lines.Clear;
FORM1.ReplaceDialog1.CloseDialog;
end
else
begin
FORM1.ReplaceDialog1.CloseDialog;
FORM1.Memo1.Lines.Clear;
end;
end;
end;
end; ///////
end;
 
后退
顶部