string wholeword

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

string wholeword

Mesaj gönderen sr1111 »

s.a
stringreplace yaptigimda sadece istedigim kelimeleri degisitirmesini istiyorum.

mesela
stringreplace:=('elmaci elma sattı', 'elma', 'armut');
burada sadece elma yi degisitirsin elmaciyi da degistiriyor.

yardimci olursaniz sevinirim.
serkand
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: string wholeword

Mesaj gönderen conari »

Kod: Tümünü seç

stringreplace:=('elmaci elma sattı', 'elma', 'armut');
Boşluklar ile kullan :D

Kod: Tümünü seç

stringreplace:=('elmaci elma sattı', ' elma ', ' armut ');
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: string wholeword

Mesaj gönderen sr1111 »

yardimci olan arkadaslara tesekkur ediyorum.

5 mb lik dosyamda cok degisecek yerler var bunun gibi ve virgul nokta parantezde var ondan dolayi farkli bir sey yapmam lazim hizlida olmasi gerekli. soyle bir sey buldum (isword) ama nasil kullanirim bilemiyorum stringreplace ile veya implant ederim.


var delims:set of char=[' ',',','.',';',':','(',')'];

function isword(start,stop:integer; s:string):boolean;
begin
if (
((start>=1) and (s[start]in delims))
or (start<1)
)
and
(
((stop<=length(s)) and (s[stop]in delims))
or (stop>length(s))
)
then result:=true
else result:=false;
end;
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: string wholeword

Mesaj gönderen Battosai »

Karakter bazlı replace yapacaksan for döngüsü işini görür aslında...ama kelime bulup değiştirme işi bilinen delphi fonksiyonları ile büyük dosyalarda zaman alıcı bir iştir...Bunun için gelişmiş fonksiyonlar var onları bulup kullanmalısın...
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: string wholeword

Mesaj gönderen sr1111 »

gelişmiş fonksiyonlar nelerdir bildikleriniz var mı. delphi de kullanabilecegimiz
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: string wholeword

Mesaj gönderen mrmarman »

Mail ile bildirdiğiniz için yazıyorum, eski bir konu olduğundan gözden ırak kalmış... :idea:

Merak ettiğiniz konuyu ardışık bir kaç aşamalı olarak düşünmekte fayda var. 1.Aşama aranılacak kelimeyi buldurmak, 2.Aşama "bulunan kelimenin başında sonunda herhangi bir karakter var mı?" sorusunun cevabını aramak, 3. Aşama sadece boşluk veya noktalama imi ise kelime statüsü vermek ve işlemi gerçekleştirmek.

Senin için bu işlemi yapan bir fonksiyon hazırladım. Aşağıda onu veriyorum. İçine remark olarak açıklamaları ekledim.

NOT: Şimdi bu açıklamayı yazarken farkettim, aranılan kelimenin sonuna bakılıyor, başlangıcına yani öncesine baktırmayı unutmuşum. Başlangıcına Kukla eklerken en başa bir de boşluk eklersen ilk kelime aranan kelime ise ondan öncesini kontrol ederken hataya düşülmesini de bertaraf etmiş olursun. Ekleyim istedim. Sen konuyu anlamışsındır eklersin. İş arasında yazıyorum, şehir dışındayım da o bakımdan...

Kod: Tümünü seç

Function BulDegistir( Aranan, Degisecek: String; Metin: String ) : String;
bir sonraki cevapta yeniden düzenlenmiş kod mevcut...
En son mrmarman tarafından 21 May 2009 09:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: string wholeword

Mesaj gönderen mrmarman »

iş hava muhalefeti nedeniyle iptal oldu, ben de otele döndüm yarım kalan kodu düzelttim... Başarılar... :idea:

Kullanımı : iki tane TMemo, iki tane de TEdit koy, Edit1'e aranan kelime, Edit2'ye değişecek kelime, Memo1'e de orjinal bir metin yaz. Ardından da bir butona aşağıdaki kodu ekle.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Memo2.Text := BulDegistir( Edit1.Text, Edit2.Text, Memo1.Text );
end;

Kod: Tümünü seç

Function BulDegistir( Aranan, Degisecek: String; Metin: String ) : String;
Const
  imler = [' ', '.', ',', ';', ':' ]; // buraya dilediğin kadar imi ekleyebilirsin...
Var
  idx : integer;
  kaynak, yigin : String;
  kukla : string;
begin
  Kaynak := Metin;
  Yigin  := '';
  Kukla  := '|'+ Aranan;
  Kaynak := ' ' + Kaynak + Kukla; // Soru : "Aranan"ı (kukla olarak) kaynağa neden ekledik ?
  // Cevap : Bu bir stratejidir, döngünün sonlanmasını garantilememiz lazım.
  //         işlemden sonra bu kısmı düşülecek ve böylece etkisiz eleman olacak...

  Repeat
    // (Length(Kaynak)-Length(Aranan)) değeri bize | işaretinin olduğu konumu verir.
    // Yani aranan kelime hiç bulunamazsa bu değere ulaşılır.
    // bulunanlar değiştikçe bu değere yaklaşılır. Dikkat edin,
    // "Bir ipe dizili boncuklar" gibi ardışık işlem yapılacak.
    idx := Pos( UpperCase(Aranan), UpperCase(Kaynak) ); // Uppercase()'i sen daha sonra
                                                        // Türkçe uppercase yapan bir
                                                        // fonksiyonla değiştirirsin.
    Yigin := Yigin + copy(Kaynak, 1, idx-2); // bulunan'ın bir önceki harfine kadar olan kısım alınır...
    System.Delete(Kaynak, 1, idx-2);

    // Şu anki aşamada bulunan kelimenin olduğu pozisyondayız. ne yapacaksak burada karar vericez
    // ya kelimeyi gerçekten bağımsız bir kelime ise replace edicez
    // ya da hiçbir değişiklik yapmadan yolumuza devam edicez.
    if (Kaynak[1] in imler) AND ( Kaynak[1+length(aranan)+1] in imler )
    then // bu bir kelimedir değişsin.
      begin
       Yigin := Yigin + Kaynak[1] + Degisecek;
       System.Delete(Kaynak, 1, 1+Length(aranan));
      end
    else // bu bir kelime bütününün parçasıdır dokunulmasın.
     begin
       Yigin := Yigin + Kaynak[1] + copy(kaynak, 2, Length(aranan));
       System.Delete(Kaynak, 1, 1+Length(aranan));
     end;
    idx := 0;
  Until idx >= (Length(Kaynak)-Length(Aranan));

  Yigin := Yigin + Kaynak; // Kaynakta kalanları -eğer varsa- sona uluyoruz.

  System.Delete( Yigin, 1,1 ); // baştaki eklediğimiz boşluğu siliyoruz.
  System.Delete( Yigin, Pos(kukla, yigin), 999999 ); // sondaki kuklayı siliyoruz.
  // ve ürünümüz... :)
  Result := Yigin;
end;
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: string wholeword

Mesaj gönderen sr1111 »

cok cok tesekkur ederim, sayin arman. uzun zamandir bekliyordum bu sorunun cevabini.
birkac sey daha soracagim bu kodla ilgili.

1- idx := Pos( UpperCase(Aranan), UpperCase(Kaynak) ); niye kullaniyoruz. ben degistir yapmadan once bir fonksiyonla tum text metni kucuk harfe ceviriyordum.
buyukharfe neden ceviriyoruz. bu satiri kaldirsam olmaz mi.

2-System.Delete( Yigin, Pos(kukla, yigin), 999999) buradaki 999999 nedir son limit bumudur bir string veya memo icin.

3-degisitir biraz yavas olmus. bunun için neler yapilabilir. mesela imler1 imler2 gibi yaparlsak hizlanir mi cunku bir kelimenin basina gelen karakterler cok azdir. sonuna gelenler daha cok. basina tab enter bosluk gibi gelirken sonuna bir cok karakter geliyor. boylelikle imler toplamda olan sayisini düsürürüz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: string wholeword

Mesaj gönderen mrmarman »

Bu fonksiyonu sana neye nasıl yaklaşacağın konusunda etüd olsun diye yazdım. Durumu kavrayıp geliştireceğin stratejiye karar vererek çözüm araman lazım. Buradan da çözümlerini herkesle paylaşabilirsin. Yine de sorularını cevaplayım.

Bu başlık altında yazılı olunca zaten bana bir eposta geliyor. İşlerinin acele olduğu açık ama hepimizin işleri var ve en az seninki kadar acil. eposta ile sormaktan vazgeçmelisin zaten kurallara da aykırı. Önceki ve bu bir tane için yapılan bir esneklik dışında devamını istemiyorum.
@sr1111 yazdı:1- idx := Pos( UpperCase(Aranan), UpperCase(Kaynak) ); niye kullaniyoruz. ben degistir yapmadan once bir fonksiyonla tum text metni kucuk harfe ceviriyordum.
buyukharfe neden ceviriyoruz. bu satiri kaldirsam olmaz mi.
- Bu durumda şunu yapacaksın.
1. Önce dediğin gibi tüm KAYNAK kodunu döngü dışında bir kere UPPERCASE yapacaksın.
2. Değişecek kelimeleri tespit ettikçe replace işlemi yapmaksızın index'lerini bir başka listede derleyip toplayacaksın.
3. Orjinal metni yeniden alıp listeye aldığın indexlerdeki kelimeleri replace yaptıracaksın. Bu sana olukça hız kazandırır.

Unutma, her farklı kelime için bu işlem tekrarlanacağından ve bu fonksiyonu tekrar tekrar çalıştıracağından, yavaşlık olmasın diye, her kelime için müstakil index listesi oluşturduktan sonra replace işlemine geçeceksin. Bu da bu fonksiyonu ikiye bölerek INDEXLER ve DEGİSİMLER fonskiyonu oluşturman demek oluyor.
@sr1111 yazdı:2-System.Delete( Yigin, Pos(kukla, yigin), 999999) buradaki 999999 nedir son limit bumudur bir string veya memo icin.
-999999 diye bir sayı veya limit söz konusu değil. Delete fonksiyonu bu rakamdan bulduğu kadarını değerlendirir ekstrasını düşünmez. Buradaki rakam (toplam uzunluk - pozisyon + bulunan kelime uzunluğu) olması gerekiyor. Buna ulaşamayacak kadar büyük bir rakam vermek yeterliydi. kafa karışıklığı yaratmasın diye böyle bir rakam verdim. Ama senin bul değiştir kodunda daha fazla karakter olacağını düşünüyorsan şimdiden bunu formüle ederek işerini halletmelisin.
@sr1111 yazdı:3-degisitir biraz yavas olmus. bunun için neler yapilabilir. mesela imler1 imler2 gibi yaparlsak hizlanir mi cunku bir kelimenin basina gelen karakterler cok azdir. sonuna gelenler daha cok. basina tab enter bosluk gibi gelirken sonuna bir cok karakter geliyor. boylelikle imler toplamda olan sayisini düsürürüz.
yukarda saydığım işlemleri yap sonra hızını yeniden değerlendir. Döngü içerisindeki fonksiyon sayısını en aza indirirsen işlemlerin kat ve kat hızlanır.
Resim
Resim ....Resim
Cevapla