string wholeword
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
string wholeword
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
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
Re: string wholeword
Kod: Tümünü seç
stringreplace:=('elmaci elma sattı', 'elma', 'armut');

Kod: Tümünü seç
stringreplace:=('elmaci elma sattı', ' elma ', ' armut ');
Bir kelimenin anlamını öğretsen bile yeter..



Re: string wholeword
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;
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;
Re: string wholeword
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...
Re: string wholeword
gelişmiş fonksiyonlar nelerdir bildikleriniz var mı. delphi de kullanabilecegimiz
Re: string wholeword
Mail ile bildirdiğiniz için yazıyorum, eski bir konu olduğundan gözden ırak kalmış...
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...

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.
Re: string wholeword
iş hava muhalefeti nedeniyle iptal oldu, ben de otele döndüm yarım kalan kodu düzelttim... Başarılar...
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.

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;
Re: string wholeword
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.
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.
Re: string wholeword
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.
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.
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.
- Bu durumda şunu yapacaksın.@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.
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.
-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ı:2-System.Delete( Yigin, Pos(kukla, yigin), 999999) buradaki 999999 nedir son limit bumudur bir string veya memo icin.
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.@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.