Bu yazdığım fonksiyonda bu işlem 20 MB'lık dosyada 1 saniyenin altında sonuçlandı:
Kod: Tümünü seç
function MyAnsiReplace(const aText, aFromText, aToText: string; aAnsiUpperCase, aFirstPosControl: Boolean; var ChangeCount: Integer): string;
var
I, J: Integer;
aFirstIndex: Integer;
St: string;
aSearchText: string;
aSearchFromText: string;
aLengthText: Integer;
aLengthFromText: Integer;
aFound: Boolean;
begin
ChangeCount := 0;
if (aText = '') or (aFromText = '') then
begin
Result := aText;
Exit;
end;
if aFirstPosControl and not aAnsiUpperCase then
if AnsiPos(aFromText, aText) < 1 then
begin
Result := aText;
Exit;
end;
if aAnsiUpperCase then
begin
aSearchText := AnsiUpperCase(aText);
aSearchFromText := AnsiUpperCase(aFromText);
if aFirstPosControl then
if AnsiPos(aSearchFromText, aSearchText) < 1 then
begin
Result := aText;
Exit;
end;
end
else
begin
aSearchText := aText;
aSearchFromText := aFromText;
end;
aLengthText := Length(aText);
aLengthFromText := Length(aFromText);
Result := '';
I := 1;
aFirstIndex := 1;
repeat
aFound := aSearchText[I] = aSearchFromText[1];
if aFound then
begin
for J := 2 to aLengthFromText do
if aSearchText[I + J - 1] <> aSearchFromText[J] then
begin
aFound := FALSE;
Break;
end;
if aFound then
begin
if aFirstIndex < I then
begin
SetLength(St, I - aFirstIndex);
System.Move(aSearchText[aFirstIndex], St[1], I - aFirstIndex);
Result := Result + St;
end;
Result := Result + aToText;
Inc(I, aLengthFromText - 1);
aFirstIndex := I + 1;
Inc(ChangeCount);
end;
end;
Inc(I);
until I > aLengthText;
if aFirstIndex < I then
begin
SetLength(St, I - aFirstIndex);
System.Move(aSearchText[aFirstIndex], St[1], I - aFirstIndex);
Result := Result + St;
end;
end;
function MyAnsiReplaceStr(const aText, aFromText, aToText: string): string;
var
aChangeCount: Integer;
begin
Result := MyAnsiReplace(aText, aFromText, aToText, FALSE, TRUE, aChangeCount);
end;
function MyAnsiReplaceText(const aText, aFromText, aToText: string): string;
var
aChangeCount: Integer;
begin
Result := MyAnsiReplace(aText, aFromText, aToText, TRUE, TRUE, aChangeCount);
end;