AnsiReplaceStr ve AnsiReplaceText Yerine Çok Daha Hızlısı

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

AnsiReplaceStr ve AnsiReplaceText Yerine Çok Daha Hızlısı

Mesaj gönderen Hakan Can »

AnsiReplaceStr ve AnsiReplaceText fonksiyonları büyük text'lerde oldukça yavaşlıyor. Örneğin 3-5 MegaByte'lık bir text için 1 saat bile sürebiliyor.

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;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Teşekkürler, eline sağlık :)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla