text den text e yazma...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Tropic
Üye
Mesajlar: 48
Kayıt: 12 Nis 2005 10:45

text den text e yazma...

Mesaj gönderen Tropic »

Arkadaşlar,

Kod: Tümünü seç

02      1      271001  TZ.YO.BP.0017.T 0       5       0
02      2      271002  TZ.YO.BP.0017.Y 0       9       0
kayıtlardan oluşan yukarıdaki formatındaki text belgeyi, aşağıdaki formatta başka bi text belgeye nasıl yazdırabilirim....

Kod: Tümünü seç

02      271001  TZ.YO.BP.0017.T 5
02      271002  TZ.YO.BP.0017.Y 9
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

hocam, sanırım şu kod işini görecektir:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  dosya:TextFile;
  Gecici:string;
  SonucListe:TStringList;
begin
  SonucListe:=TStringList.Create;
  AssignFile(dosya,'c:\deneme.txt');
  reset(dosya);
  while not eof(dosya) do
  begin
    Readln(dosya,Gecici);
    Gecici:=copy(Gecici,1,2)+' '+copy(Gecici,16,6)+' '+copy(Gecici,24,15)+' '+copy(Gecici,48,9);
    SonucListe.Add(Gecici);
  end;
  SonucListe.SaveToFile('c:\DenemeSonuc.txt');
end;
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

hocam,
sonucliste.savetofile den sonra
closefile(dosya);
sonucliste.free;
yaparsak daha teknik olacaktır sanırım... Kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Tropic
Üye
Mesajlar: 48
Kayıt: 12 Nis 2005 10:45

?

Mesaj gönderen Tropic »

Hocam sütunlardaki değerler sabit hizalı değil,

Kod: Tümünü seç

02      1      271001  TZ.YO.BP.0017.T 0       5       0 
02      2      271002  TZ.YO.BP.0017.Y 0       9       0
02      3      8434892931784   AA.BB.CC.DDDD.E 0       10000       0
yukarıdaki örnekte 3. bir sütun ekledim. Bu şekildede devam ediyor, tekrar kısalıyor. Satır sayısı ile çözemeyiz bu durumu...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

hocam biraz karışık oldu ama sanırım doğru oldu...
Test ettim ama çok da fazla test etme şansım olmadı...
Genel mantığı anladıktan sonra daha derli toplu yapabilirsin sanırım:
Kod şu:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  dosya:TextFile;
  Gecici:string;
  Sonuc:String;
  Geciciler:array[0..6] of string;
  SonucListe:TStringList;
  i,j,YazilanSutunNo,BaslangicNoktasi:integer;
begin
  SonucListe:=TStringList.Create;
  AssignFile(dosya,'c:\deneme.txt');
  reset(dosya);

  while not eof(dosya) do
  begin
    Readln(dosya,Gecici);

    Gecici:=Trim(gecici); //sağ ve soldaki boşluklar temizleniyor...

         //ilk harfi gösterecek olan,
                  //döngü sayacının ilk değeri veriliyor...
    YazilanSutunNo:=0; //ilk sütundan yazılmaya başlanacak
    BaslangicNoktasi:=1; //copy fonksiyonu için başlangıç indeksi
    Sonuc:=''; //sonuç elemanı boşaltılıyor...
    geciciler[0]:='';
    geciciler[1]:='';
    geciciler[2]:='';
    geciciler[3]:='';
    geciciler[4]:='';
    geciciler[5]:='';
    geciciler[6]:='';

    for i:=0 to length(gecici)-1 do
    begin
      if (i>0) and (gecici[i-1]=' ') and (gecici[i]=' ') then
        continue; //yan yana bir sürü boşluk olabilir...

      if gecici[i]=' ' then
      begin
        inc(YazilanSutunNo);
        continue;
      end;

      Geciciler[YazilanSutunNo]:=Geciciler[YazilanSutunNo]+Gecici[i];
    end;

    Sonuc:=geciciler[0]+' '+geciciler[2]+' '+geciciler[3]+' '+geciciler[5];
    SonucListe.Add(Sonuc);
  end;
  SonucListe.SaveToFile('c:\DenemeSonuc.txt');
end;
Kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

Şimdi farkettim. orjinal txt dosyasında sütunların arasındaki boşluklar ara çubuğuyla değil de sadece tab tuşuyla yapıldıysa bu prosedür bunları algılayamıyo... eğer orjinal veri tabanında aradaki boşluklar tab tuşuyla yapıldıysa tab tuşunu da prosedürün ilgili yerlerine eklemen gerekecek. Kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Tropic
Üye
Mesajlar: 48
Kayıt: 12 Nis 2005 10:45

?

Mesaj gönderen Tropic »

Hocam

Kod: Tümünü seç

02      271001  TZ.YO.BP.0017.T 5 
02      271002  TZ.YO.BP.0017.Y 9
bu format çıkmıyor. kaynak textin tüm satırlarını aynen yazıyor. Ayrıca boşluklar space le değil tab tuşu ile verilmiş...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

al hocam, bu sefer oldu... Sayende tab tuşunun kodunun 9 olduğunu da öğrenmiş oldum, teşekkürler :)

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  dosya:TextFile;
  Gecici:string;
  Sonuc:String;
  Geciciler:array[0..6] of string;
  SonucListe:TStringList;
  i,j,YazilanSutunNo,BaslangicNoktasi:integer;
begin
  SonucListe:=TStringList.Create;
  AssignFile(dosya,'c:\deneme.txt');
  reset(dosya);
  while not eof(dosya) do
  begin
    Readln(dosya,Gecici);
    showmessage(Gecici);

    Gecici:=Trim(gecici); //sağ ve soldaki boşluklar temizleniyor...

         //ilk harfi gösterecek olan,
                  //döngü sayacının ilk değeri veriliyor...
    YazilanSutunNo:=0; //ilk sütundan yazılmaya başlanacak
    BaslangicNoktasi:=1; //copy fonksiyonu için başlangıç indeksi
    Sonuc:=''; //sonuç elemanı boşaltılıyor...
    geciciler[0]:='';
    geciciler[1]:='';
    geciciler[2]:='';
    geciciler[3]:='';
    geciciler[4]:='';
    geciciler[5]:='';
    geciciler[6]:='';

    for i:=0 to length(gecici) do
    begin
      if (i>0) and ((gecici[i-1]=' ') or (gecici[i-1]=#9)) and ((gecici[i]=' ')or(gecici[i]=#9)) then
        continue; //yan yana bir sürü boşluk veya tab (veya boşluk veya tab yan yana)olabilir...

      if (gecici[i]=' ')or(gecici[i]=#9) then
      begin
        inc(YazilanSutunNo);
        continue;
      end;

      Geciciler[YazilanSutunNo]:=Geciciler[YazilanSutunNo]+Gecici[i];
    end;

    Sonuc:=geciciler[0]+' '+geciciler[2]+' '+geciciler[3]+' '+geciciler[5];
    SonucListe.Add(Sonuc);
  end;
  SonucListe.SaveToFile('c:\DenemeSonuc.txt');
end;


kolay gelsin...
(Bu arada kodu yazmak biraz aceleye geldi. Dağınık oldu... Tekniğe pek uygun değil, ama genel itibariyle bir fikir edinmeni sağladıysam ne mutlu bana...)
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Tropic
Üye
Mesajlar: 48
Kayıt: 12 Nis 2005 10:45

Mesaj gönderen Tropic »

Hocam bu sefer tamam ama bişey daha sorucam...

Kod: Tümünü seç

01      13      1       21.12.2006 02:08:00     21.12.2006 02.08.00
02      1       271001  TZ.YO.BP.0017.T 0       5       0 
02      2       271002  TZ.YO.BP.0017.Y 0       9       0
yukarıdaki kaynak text in ilk satırı devamındaki satırlardan hariç

Kod: Tümünü seç

01      13       1      21.12.2006 02:08:00     100      1
02      271001   TZ.YO.BP.0017.T	10
02      271002   TZ.YO.BP.0017.Y	9
aşağıdaki oluşan text in ilk satırındaki hale nasıl çeviririm. Kodlar hep karışacak...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

Kod: Tümünü seç

Sonuc:=geciciler[0]+' '+geciciler[2]+' '+geciciler[3]+' '+geciciler[5]; 
    SonucListe.Add(Sonuc); 
hocam, yazdığım bu satırda hangi sütunların yeni text dosyamıza geleceğine karar veriyorum. String tipindeki 'Sonuc' değişkeninde gerekli sütunlardaki değerleri birleştiriyorum (1. satır). 2. satırda da TStringList tipli nesne olan SonucListe'ye bu sonuc değişkenini ekliyorum...

Mesela sen ilk satır için farklı bir uygulama yapmak istiyosun... O zaman
örneğin;

Kod: Tümünü seç

if SonucListe.Count=0 then //listede henüz hiç eleman yoksa...
      Sonuc:=geciciler[0]+' '+geciciler[1]+' '+geciciler[5]+' bişeyler,bişeyler '+gecici[4]
else
      Sonuc:=geciciler[0]+' '+geciciler[2]+' '+geciciler[3]+' '+geciciler[5]; 
    SonucListe.Add(Sonuc); 
gibi bişeyle halledebilirsin sanıyorum... Bi de önceden de dediğim gibi, çok teknik bi kod olmadı, karışık oldu. Bunu çok kullanacaksan eğer; dışarda parametre alan bir prosedür şeklinde yaparsan çok daha iyi olur... Bi de 'Geciciler' dizim statik oldu, bu yüzden orjinal text dosyanda 7den fazla sütun olursa hata verir... Onu dinamik yaparsan (tabi gerekli yerlerde gerekli hafızayı ayırarak) sütun sayısı tanımaz, daha esnek olur... Dinamik dizileri tavsiye ederim, güzel bişey... Kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Cevapla