unicode text cevirme yardim

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

unicode text cevirme yardim

Mesaj gönderen sr1111 »

esselamu aleykum...
delphide yeniyim. ne kadar ugrastim isede basaramadim. yardimci olursaniz cok memnun olacagim.

yapmak istedigim şu:
bir memo alanim var burada yazilan yaziyi veya acilan rtf formatli text yazi icinde harfleri replace degsitirme yapmak istiyorum. fakat soyle olmali.

bir unicode text olan deg.txt gibi dosyada yazmis oldugum harf ve kelimeri uygulaycak. unicode olmasi sart benim icin azerice ve rusca turkce harflerim var.

unicode olan deg.txt icregi soyle: harfler arasinda tab var. butona basinca mesela gg harfini memo alaninda gorunce ğ ile, gg -> q ile sch -> ş ile degistirmeli.

g ğ
gg q
sch ş
QU yu


deg.txt tablomda 150 kadar bu sekilde harf, kelimeler var. actigim tex veyaa .rtf dosyasida 10-20 mb olabilir. ona gore de cok hzli bir sekilde degisitirsin istiyorum.

yardimci olursaniz cok sevinirim.
serkan
Kullanıcı avatarı
Search
Üye
Mesajlar: 74
Kayıt: 01 Oca 2008 01:03
Konum: Konya

Re: unicode text cevirme yardim

Mesaj gönderen Search »

Anladıgım kadarıyla cevap verdim...Yanlıs anlamıs olabilirim

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
 begin
     Memo1.Lines.LoadFromFile('C:\deg.txt');
     memo1.Lines.Text :=AnsiReplacetext(memo1.Lines.Text,'g','ğ');
     memo1.Lines.Text :=AnsiReplaceText(memo1.Lines.Text,'sch','ş');
     memo1.Lines.Text :=AnsiReplaceText(memo1.Lines.Text,'QU','yu');
     Memo1.Lines.SaveToFile('C:\deg.txt');
  end;
end.
kolay gelsin...
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage('Dehanın %1 i ilham %99u terdir.');
end;
end.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: unicode text cevirme yardim

Mesaj gönderen unicorn64 »

şuan dosyayla falan uğraşmamak için listbox a yazdım deg.txt içeriğini.
listbox1 de kaynak değerler, listbox2 de hedef değerler var.
memo1 e yazdığım rasgele yaz içnde değiştirilmesini istediğim karakterler vardı işlem sonucunda değişmiş hali mem2 ye yazıldı.
yalnız burada 2 sorun var.
1.si g->ğ ve gg->q demişsin bu durumda biraz kontrol gerekiyor. çünkü bu kodla gg deki ilk g yi ğ yapıyor ve ğg oluyor dolayısıyla q olması gereken değer ğğ oluyor.
2.si 10 mb lık dosyanın bu yöntemle taranması biraz zaman alır sanırım.
belki thread işi çözer ama biraz uğraşmak gerek.
ne kadar mantıklı bir çözüm bilmiyorum ama ilk aklıma gelen yöntem bu

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
satir:string;
begin
 Memo2.Lines.Clear;
 for i:=0 to Memo1.Lines.Count-1 do
 begin
  satir:=Memo1.Lines[i];
  for j:=0 to ListBox1.Items.Count-1 do
  begin
   satir:=AnsiReplaceText(satir,ListBox1.Items[j],ListBox2.Items[j]);
  end;
  Memo2.Lines.Add(satir) ;
 end;
end;
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: unicode text cevirme yardim

Mesaj gönderen sr1111 »

memo1.Lines.Text :=AnsiReplacetext(memo1.Lines.Text,'g','ğ');
AnsiReplacetext ile ( parantez arasi bu satir hata veriyor


tesekkur ederim.
ama tam isi halledemedik.
deg.txt dosyasi bizim tablomuz icinde degerler olan unicode text tablomuz (degisecek ve hedef degerler var)
gg (sekme) q
g (sekme) ğ
sch (sekme) ş

içi boyle devam edip gidiyor
150-200 kadar kelime var bunlari delphi icersine
memo1.Lines.Text :=AnsiReplaceText(memo1.Lines.Text,'sch','ş');
bu sekilde 200 tane yazmak zor oluyor sonra nasil program idisindan degisiklikler yapabilirim. yani bu degerleri deg.txt icerisinden okunmali.

sunlar yaplimali zannediyorum ama yapamadim.
1-deg.txt unicode belgesi okutturulup birinci sutun bulunup ve ikinci sutun alanlanındaki ile degisitirilmeli. tabi aralarinda sekme var ve unicode bir belge.
2-acilmis veya yazilmis olan memo veya richedit belgesindeki yaziya uygulanmali
bunun icin ansireplace mi yoksa unicode oldugundan unicodeu destekleyen bir replace mi gerekli.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: unicode text cevirme yardim

Mesaj gönderen Hakan Can »

Öncelikle bütün işlemleri TStringList kullanarak yapmanızda fayda var. Ama her halukarda BeginUpdate ve EndUpdate alt yordamlarını kullanmalısınız (hız açısından).

Karakter sayısı çok olandan az olana şeklinde sıralayıp sonrasında replace işlemini yapmalısınız. Yani önce gg'yi sonra g'yi şeklinde. Bunu da Length fonksiyonunu kullanarak yapabilirsiniz.

Bir de şu replace komutlarını kullanırsanız işleminiz normal replace komutlarına oranla oldukça hızlı olacaktır:

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 System.Pos(aFromText, aText) < 1 then
    begin
      Result := aText;
      Exit;
    end;

  if aAnsiUpperCase then
  begin
    aSearchText := AnsiUpperCase(aText);
    aSearchFromText := AnsiUpperCase(aFromText);
    if aFirstPosControl then
      if System.Pos(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);
          Move(aText[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);
    Move(aText[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;
İyi çalışmalar.
Kullanıcı avatarı
Begin.End
Üye
Mesajlar: 45
Kayıt: 05 Nis 2007 11:50

Re: unicode text cevirme yardim

Mesaj gönderen Begin.End »

memo1.Lines.Text :=AnsiReplacetext(memo1.Lines.Text,'g','ğ');
AnsiReplacetext ile ( parantez arasi bu satir hata veriyor
AnsiReplaceText için usese StrUtils 'i eklemen lazım

Kolay Gelsin...
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: unicode text cevirme yardim

Mesaj gönderen sr1111 »

acaba load etmeden deg.txt dosyasindan memodaki yaziya nasil uygulacagim tab karakteri oldugundan.

TAB = #9; bu degeri nasil kullanmam lazim.
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: unicode text cevirme yardim

Mesaj gönderen sr1111 »

yardimci olanlara tesekkur ederim. biraz ilerleme kaydederek
stringgrid de cagirdim deg.txt yi. simdi stringgrid1 deki 1. sutun(bulunacaklar) ve 2.sutundaki(degiştirilecek) degerleri nasil uygulayacagim memo1 e.

Şu işe bir el atinda konu kapansin ustalar.

soyle bir sey yaptim ama olmadi. nasil bir sey yapmam lazim.
memo1.Lines.Text :=AnsiReplaceText(memo1.Lines.Text,'a.TXT', '#9', StringGrid1);
Cevapla