Şimdi Ara

C# ile yazdığım küçük programa Müdürüm çok yavaş çalışıyor dedi

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
37
Cevap
0
Favori
5.354
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • İş yerinde benden rutin bir hesabı çok fazla kere tekrarlayan bir .exe dosyası üretmem istendi.
    Algoritma planım oldukça basit:
    1.dosya.txt den datayı satır satır al, her satır için rutin hesap işlemlerini gerçekleştir, çıktıyı 2.dosya.txt'ye yazdır.

    Büyük bir heyecanla yaptığım exe'yi müdüre gönderdim.
    Müdür ise 100 milyon satırlık (her bir satır ondalıklı kısımlar dahil 8 haneden oluşan boşlukla ayrılmış 6 sutun içeriyor) txt dosyasını çok yavaş işlediğini söyleyerek tepki gösterdi. Olmamış bu dedi :)
    Biraz bozuldum ama pes etmek istemiyorum. Durumu telafi etmek adına uzun süredir internette çözüm arıyorum. Müdürün iddiası 100 milyon satırın hesabını 5-6 dk içinde yapan bir .exe yazmış geçmişte.
    Ancak bu .exe dosyası 64 bit makinalarda çalışmayan ve basic diliylemi ne yazmış. Güncel yazılım dillerini öğrenecek yaşı geçtiğini düşündüğünden bu ulvi görevi bana verdi ama ben de onu hayal kırıklığına uğrattım.
    C# bilgim amatör seviyededir. Ama bugüne kadarki yazdığım programcıklar beni hiç yarı yolda bırakmadı.

    Merak ettiğim şunlar:
    1-) C# console ile C# windows aplication arasında hız açısından fark olur mu?
    2-) Gerçekten her biri 8 karakter içeren 6 sutundan oluşan 100 milyon satır bir .txt dosyasından alınıp başka bir .txt dosyasına 5-6 dk. da yazdırmak mümkün müdür? (müdür müdür müdür )
    3-)Bir for döngüsü ile 100 milyona kadar artan i değerini bile bir .txt dosyasına yazdırmak 1 saati geçiyor. Bu normal midir?

    Algoritmamın basitleşmiş hali şu şekildedir:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;

    namespace WindowsApplication1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    string[] metin;
    decimal hn;
    decimal sn;
    string writeThisis;
    string yazi;
    StreamReader oku;
    //-----------------------------------------------------------------------------
    oku = File.OpenText("dosya1.txt");
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = Paket(yazi).Split(';');
    hn = Convert.ToDecimal(metin[1]) + Convert.ToDecimal(metin[2]);
    sn = Convert.ToDecimal(metin[3]) + Convert.ToDecimal(metin[4]);
    writeThisis = "" + (hn * sn);
    yazici(writeThisis);
    }
    }
    public void yazici(string yzT)
    {
    StreamWriter SW = File.AppendText("dosya2.txt");
    SW.WriteLine(yzT);
    SW.Close();
    }
    private static string Paket(string dizi)
    {
    string eko = "";
    string yz = edit(dizi.ToString());
    string[] Paket = yz.Split();
    for (int i = 0; i < Paket.Length; i++)
    {
    if (Paket[i] != "")
    {
    eko += Paket[i] + ";";
    }
    }
    return eko;
    }
    private static string edit(string datam)
    {
    string oks;
    oks = datam.ToString();

    return oks;
    }
    }
    }


    Yardımlarınızı, eleştirilerinizi, tavsiyelerinizi ve önerilerinizi bekliyorum.



    < Bu mesaj bu kişi tarafından değiştirildi tatari81 -- 14 Mart 2014; 14:26:31 >







  • 1. Tabiki olur
    2. Daha az surede yapmak bile mumkun
    3. Kesinlikle normal degil

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Rica etsem çok basit bir algoritmayla yardımcı olabilir misiniz? fikir versin yeterli. Geliştirmeyi halledebilirim.
  • Oncelikle ise String ve StringBuilder arasindaki farklara bakarak baslayabilirsin.
  • Yapılan işlemler bişey değil, sadece dosya kopyalıyorsun. Buffer ı 64kb civarı ayarla ve yapabilirsen yazmayı başka thread e al. Fakat yine de uzun sürer, sanırım 5gb falandır dosya?
  • Çok sağolun. Haklısınız. Yaptığım iş temelde bir dosyanın içeiriğinde minik bir değişiklik yaparak kopyalamak. Tahmininiz de doğru. Okumam gereken dosya 5-6 GB civarında.
    Ben hayatımda böyle bir .txt dosyasıyla hiç başbaşa kalmamıştım. Benim yaptığım .exe nin yazma hızı 10 kb/sn civarında. Bunun 10 MB/sn mertebelerinde olmasını bekliyorlar.

    Açıkçası müdürümün dediği pek inandırıcı gelmedi. Bukadar büyük metin dosyasının windowsta açılması bile uzun dakikalar sürüyor. Buffer meselesini araştıracağım.
    Çünkü bugüne kadar hız hiç bukadar ihtiyaç olmamıştı benim için. Çünkü basit excell fonksiyonlarıyla işlem yapılan uygulamalarla uğraşıyoruz.

    Konuyu açtığımdan beri hala bakınıyorum.

    Acaba çok basit bir şekilde hızlı okuyup hızlı yazan küçük birşey paylaşabilir misiniz? Başka bişey olmasına gerek yok. Tekniği görebilmek adına. Olursa iyi olur. Olmazsa yukarıda araştırmamın faydalı olacağı söylenilen konuları araştıracağım.




  • Yazdığın koda pek dikkat etmemiştim ama 10kb/sn deyince bakma ihtiyacı hissettim. :) C# bilmediğim için detaylı bilgi veremem ama kodda ciddi hatalar gördüm.

    1- Dosya okuyup yazan nesnelerin buffer boyunu alan kurucu metodları varmış. Bunları kullan ve buffer ı 64 * 1024 yap.http://msdn.microsoft.com/en-us/library/vstudio/72d9f8d5(v=vs.110).aspx
    2- decimal türü 128 bitmiş, oldukça yavaş çalışır. float ya da double kullan.
    3- Ölümcül bir hata yapmışsın, yavaşlığın ana kaynağı bu. "yazici" metodun her satırı yazarken yeni nesne kuruyor ve sonra da dosyayı kapatıyor. Dosya kapatılırken bütün buffer dosyaya yazılır (flush) sonra kapatılır. Diğer bir deyişle buffer hiç dolmaz, yani etkisiz hale gelir. Ekstra cpu kullanımı da cabası. Yapman gereken şey streamreader ve streamwriter nesneleri ya sınıfın bir üyesi olacak, ya da static olacak (bu daha iyi). Bu durumda yazici metodun sadece tek satırdan ibaret olur. "yaz.WriteLine(blabla);"

    Dosya komple yazıldıktan sonra Close ile kapatırsın ve nesneleri null larsın ki çöp toplayıcı işini yapsın.




  • Bence nosql konusunu arastir.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Eyvallah abi.. hemen dediklerini düzeltme çalışmasına başlıyorum. Cevap veren bütün arkadaşlar teşekkür ederim. Sonuca ulaşamazsam yine yazarım.. @elektro_gadget
  • SSIS ile aslında bu işler olur,iki flat file arasına bir derived kolon üzerinden islemlerini tanımla koy msql servera tanımla jobunu babalar gibi isi bitirsin senin mudurde bu ne yaa desin :))
  • İlk önce döngünün içinde her seferinde yeniden dosyayı kapattığım kısmı döngü sonuna aldım. Ayrıca Decimal yerine double kullandım.
    Sadece bu bile 6 saat sürecek işi 20 dk ya kadar düşürdü. Buffer olayını araştırdım ama programa ekleyemedim.
    Ve string işlemlerimi hızlandırmak adına stringbuilder üzerinde araştırma yaptım. String builder ile birleştirmeler yaptım ama biyerde hata yapıyor olmalıyım ki sonuç dosyası 60 kat şişiyor. Ve textdosyasını açamıyorum.
    Yani içeride neler oluyor göremiyorum .

    Cevaplar için teşekkürler. Yeni fikirlerinize açığım. nonsql baya derin konu gibi geldi. Enazından onun için şimdilik pek vaktim yok. Buffer ve string builder üzerinde yoğunlaşacağım.
  • İşlemleri çok daha kısaltma amaçlı çalışmalarım hala devam ediyor.
    Bütün dosyayı Stringbuilder'a atayıp, stringbuilderı stringe atayıp sonra işlemlere geçersem daha hızlı olacağını düşünüyorum.
    Fakat dosyayı stringbuildera aktarırken out of memory hatası almaya başladım. Stringbuilderın kapasitesini aşıyor dosya içeriği.

    Nasıl bir yol izlemeliyim?



    < Bu mesaj bu kişi tarafından değiştirildi tatari81 -- 20 Mart 2014; 15:31:15 >
  • şu anki en güncel halini yaz kodunun bir daha bakalım
  • evde 120 milyon satırlı dosya yaptım yaklaşık 6-7 dk da bitiyor

    private void button1_Click(object sender, EventArgs e)
    {

    string[] metin;
    decimal hn;
    decimal sn;
    string yazi;
    StreamReader oku;
    string writeThisis;
    //-----------------------------------------------------------------------------
    oku = File.OpenText("dosya1.txt");
    StreamWriter SW = File.CreateText("dosya2.txt");
    SW.AutoFlush = true;

    int _line = 0;
    int LineBUFFER = 40000;
    string[] Lines = new string[LineBUFFER];
    int lineCount = 0;

    while (!oku.EndOfStream)
    {

    _line = 0;
    while ((yazi = oku.ReadLine()) != null && _line < LineBUFFER)
    {
    Lines[_line] = yazi;
    _line++;
    }

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < _line; i++)
    {
    metin = Paket(Lines).Split(';');
    hn = Convert.ToDecimal(metin[1]) + Convert.ToDecimal(metin[2]);
    sn = Convert.ToDecimal(metin[3]) + Convert.ToDecimal(metin[4]);
    writeThisis = (hn * sn).ToString();
    sb.AppendLine(writeThisis);
    }

    SW.WriteLine();
    lineCount += _line;

    }
    SW.Close();
    }

    private static string Paket(string dizi)
    {
    string eko = "";

    string[] Paket = dizi.Split();
    for (int i = 0; i < Paket.Length; i++)
    {
    if (Paket != "")
    {
    eko += Paket + ";";
    }
    }
    return eko;
    }
    private static string edit(string datam)
    {
    string oks;
    oks = datam.ToString();

    return oks;
    }




  • Hocam sorunun cevabi bu kitapda sakli
     C# ile yazdığım küçük programa Müdürüm çok yavaş çalışıyor dedi

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Bu islem tek threadda zor gibi. Ama yine de nosql konusunu bir arastirin. 20 30 sn den fazla surecek bi isleme benzemiyor.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Dostum stringBuilder sınıfı kullanman çok yerinde olmuş.
    string birleştirirken += kullanmayı unut. Bunu yaparken her seferinde "string mi la bu,ha stringmiş,yabıştırayım" der bilgisayar. stringBuilder sınıfının string eklemede,birleştirmede kullanılan metodları var,onları kullan. Tür kontrollerinden kurtulmuş olursun.
    Bu senin string işleme hızını abartısız ve objektif şekilde 3 e katlar. Yukarıda AppendLine 'ı alttaki metoda da uygula.

    Bir de,metodlara bölmüşsün,bölme. Aynı kod bloğunun içinde olsun. Aksi halde her seferinde ramden yer ayrılır,remdeki yer boşaltılır,ayrılır,boşaltılır...
  • Bu tür işlemlerde PERL dilinin çok hızlı olduğunu duymuştum onu deniyebilirsin.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: Moribito

    Oncelikle ise String ve StringBuilder arasindaki farklara bakarak baslayabilirsin.

    Foruma fazla takılamıyorum. Ama Moribito'nun cevaplarını görüyorum. Bu kişinin yanıtlarını her zaman dikkate alın derim.

    StringBuilder, string'den kat ve kat hızlı çalışır ayrıca kod okunurluğunu artırır.

    EDİT: Bir StringBuilder sınıfının alabileceği en yüksek boyut, 2.147.483.647 (int32 max değeri) (bu değeri artırmanın bir yolu var mı, yani int64 yapılabilir mi bilmiyorum, bilen varsa söylerse sevinirim, bende öğrenmiş olurum )

    Ayrıca StopWatch sınıfını kullanarak döngülerinde hız testi yapabilirsin, hangi kodda çok zaman harcanıyor bulmanda yararlı olur.

    StringBuilder sınıfının metotları araştır. (append, appendline vs... appendformat) , birde bazı özelliklerini öğren (capacity gibi)



    < Bu mesaj bu kişi tarafından değiştirildi Last Programmer -- 24 Mart 2014; 21:05:58 >




  • Last Programmer kullanıcısına yanıt
    Herkese çok teşekkür ederim. Evet Moribito'nun uyarısını dikkate alıp stringbuilder üzerinde yoğunlaşarak ve elektro_gadget gibi diğer arkadaşların önerilerini kendimce uygulayarak süreyi 20 dk civarına düşürdüm. Sadece nosql konusunda pek birşey yapamadım. Beni aşıyor biraz :)

    Hala peşindeyim bunu daha kısaltmanın :)

    Bizim müdürün yıllar önce sanıyorum basicde yazdığı, şu an 64 bitte çalıştıramıyorum dediği console algoritmayı paylaşmak belki faydalı olabilir.

    Tabi ben yukarıda sadece datayı aldığımı basit bir işlem yapıp yazdırmayı danıştım. Aradaki hesaplamaları yapabilirim diye.
    Bu kodlarda arada farklı hesaplar yapmakta. Önemli olan bunun kadar neden hızlı birşeyler yazamadığım :) hala benden 5 kat hızlı çalışıyor aşağıdaki.

     
    5000 ?"*.2d dosyasina 1. dogrunun 1. noktasnn y x
    ?" 1. dogrunun 2. noktasnn y x
    ?" 2. dogrunun 1. noktasnn y x
    ?" 2. dogrunun 2. noktasnn y x
    ?"i girilir, dosya ad verilir. verilen dosyann
    ?" 1. dogrudaki koordinatlara gore 2. doguya donusumu yapilir"
    input"Okunacak donusum dosyasi adi...*.2d ",dosya1$
    if dosya1$="" then 1
    open dosya1$+".2d" for input as 1
    input#1,y11#,x11#
    input#1,y12#,x12#
    input#1,y21#,x21#
    input#1,y22#,x22#
    close#1
    dy1#=y12#-y11#:dx1#=x12#-x11#
    dy2#=y22#-y21#:dx2#=x22#-x21#
    s1#=sqr(dy1#*dy1#+dx1#*dx1#)
    s2#=sqr(dy2#*dy2#+dx2#*dx2#)
    dy1#=dy1#/s1#:dx1#=dx1#/s1#
    dy2#=dy2#/s2#:dx2#=dx2#/s2#
    if dx1#=0 or dy1#=0# then e#=0#:goto 5005
    e#=dy1#/dx1#+dx1#/dy1#
    rem ?dy1#,dx1#,e#,s1#
    rem ?dy2#,dx2#,s2#
    5005 input"Donusecek dosya dosyasi adi...*.* ",dosya1$
    if dosya1$="" then 1
    input"YAZILACAK dosya dosyasi adi...*.* ",dosya2$
    if dosya2$="" then 5005
    if dosya1$=dosya2$ then 5005
    ?"doya 1=xyz,rgb 2=xzy,rgb 3=xyz 4=xzy"
    5006 ww$=inkey$:if ww$="" then 5006
    if ww$="1" or ww$="2" or ww$="3" or ww$="4" then 5007 else 5006
    5007 input"mesafeye gore ayklama taplacakm E/H";me$
    if me$<>"E" then 5018
    input "aralk baslangc ";mes1#
    input " bitis ";mes2#
    if mes1#=mes2# then ?"olmad tekrar dene":goto 5007
    if mes1#>mes2# then ?"olmad tekrar dene":goto 5007

    5018 open dosya1$ for input as 1
    open dosya2$ for output as 2
    sk#=50000#:sb#=-50000#
    5020 if eof(1) then 5090
    input#1,y#,x#,h#,r%,g%,b%
    hn#=((y#-y11#)/dy1#+(x11#-x#)/dx1#)/e#
    sn#=((x#-x11#)+dy1#*hn#)/dx1#
    hn#=hn#*-1#
    if sn#<sk# then sk#=sn#
    if sn#>sb# then sb#=sn#
    if me$<>"E" then 5022
    if sn#<mes1# or sn#>mes2# then 5020
    5022 rem kayit
    if ww$="1" then print#2,using"#####.#### #####.#### #####.#### ### ### ###";sn#,hn#,h#,r%,g%,b% if ww$="2" then print#2,using"#####.#### #####.#### #####.#### ### ### ###";sn#,h#,hn#,r%,g%,b% if ww$="3" then print#2,using"#####.#### #####.#### #####.####";sn#,hn#,h# if ww$="4" then print#2,using"#####.#### #####.#### #####.####";sn#,h#,hn#
    goto 5020
    5090 close#1
    ?using"dik ayagi saga deger en kucuk=#####.### en buyuk=#####.###";sk#,sb#
    input w$
    close#1:close#2
    ?"bittiiiiii":?:?:goto 5005
    goto 1



    Bu da benim yazdığım algoritma bozuntusu :) elbette windows aplikasyonu olduğu için müdürünkünden daha uzun :

     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;

    namespace Donusum_Uygulamasi
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    GorunurOFF();
    }
    //----------------------------------------------------------------------------------------
    StreamReader oku;
    StreamWriter SW;
    string[] metin;
    string yazi;
    //----------------------------------------------------------------------------------------
    private void Stringer(double uy11, double ux11, double udy1, double udx1, double ue)
    {
    oku = File.OpenText("" + textBox5.Text);
    double hn = 1;
    double sn = 1;
    double big = -500000;
    double small = 500000;
    bool mesafeCheck = false;

    AL.Enabled = false;
    DSclose.Enabled = false;
    DSopen.Enabled = false;
    NoktaBulutu.Enabled = false;
    filtreOK.Enabled = false;
    filtreNO.Enabled = false;
    SW = File.AppendText("" + textBox2.Text + ".xyz");
    if (textBox3.Visible == true)
    {
    mesafeCheck = true;
    }
    else
    {
    mesafeCheck = false;
    }

    //*********************************************************************************************
    StringBuilder pivot = new StringBuilder();
    if (mesafeCheck == false)
    {
    if (checkBox1.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Math.Round(Convert.ToDouble(metin[0]), 6) - uy11) / udy1 + ((ux11 - Math.Round(Convert.ToDouble(metin[1]), 6)) / udx1)) / ue;
    sn = (((Math.Round(Convert.ToDouble(metin[1]), 6) - ux11)) + udy1 * hn) / udx1;
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(metin[3]);
    pivot.Append(" ");
    pivot.Append(metin[4]);
    pivot.Append(" ");
    pivot.Append(metin[5]);
    pivot.AppendLine();
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    else if (checkBox2.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.AppendLine();
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    else if (checkBox3.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(metin[3]);
    pivot.Append(" ");
    pivot.Append(metin[4]);
    pivot.Append(" ");
    pivot.Append(metin[5]);
    pivot.AppendLine();
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    else if (checkBox4.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Math.Round(Convert.ToDouble(metin[0]),6) - uy11) / udy1 + ((ux11 - Math.Round(Convert.ToDouble(metin[1]),6)) / udx1)) / ue;
    sn = (((Math.Round(Convert.ToDouble(metin[1]),6) - ux11)) + udy1 * hn) / udx1;
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.AppendLine();

    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }

    }
    //***************************************************************************************
    else if (mesafeCheck == true)
    {
    double deg1 = Convert.ToDouble(textBox3.Text);
    double deg2 = Convert.ToDouble(textBox4.Text);
    if (checkBox1.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn > deg1 && sn < deg2)
    {
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(metin[3]);
    pivot.Append(" ");
    pivot.Append(metin[4]);
    pivot.Append(" ");
    pivot.Append(metin[5]);
    pivot.AppendLine();
    }
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    else if (checkBox2.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn > deg1 && sn < deg2)
    {
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.AppendLine();

    }
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();

    }
    else if (checkBox3.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn > deg1 && sn < deg2)
    {
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.Append(" ");
    pivot.Append(metin[3]);
    pivot.Append(" ");
    pivot.Append(metin[4]);
    pivot.Append(" ");
    pivot.Append(metin[5]);
    pivot.AppendLine();
    }
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    else if (checkBox4.Checked == true)
    {
    while ((yazi = oku.ReadLine()) != null)
    {
    metin = yazi.Split();
    hn = ((Convert.ToDouble(metin[0]) - uy11) / udy1 + ((ux11 - Convert.ToDouble(metin[1])) / udx1)) / ue;
    sn = (((Convert.ToDouble(metin[1]) - ux11)) + udy1 * hn) / udx1;
    if (sn > deg1 && sn < deg2)
    {
    if (sn < small)
    {
    small = sn;
    }
    if (sn > big)
    {
    big = sn;
    }
    pivot.Append(Math.Round(sn, 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(Convert.ToDouble(metin[2]), 4));
    pivot.Append(" ");
    pivot.Append(Math.Round(-hn, 4));
    pivot.AppendLine();

    }
    }
    SW.WriteLine(pivot.ToString());
    label7.Visible = true;
    AL.Enabled = true;
    DSclose.Enabled = true;
    DSopen.Enabled = true;
    NoktaBulutu.Enabled = true;
    filtreOK.Enabled = true;
    filtreNO.Enabled = false;
    label7.Text = "Hesap Tamamlandı";
    labelP.Visible = true;
    labelP.Text = "En küçük: " + Math.Round(small, 4) + " En büyük: " + Math.Round(big, 4);
    SW.Close();
    oku.Close();
    }
    }
    }

    private static string satiral(string datam)
    {
    string oks;
    oks = datam.ToString();

    return oks;
    }

    private static string sarrayPaket(string dizi)
    {
    StringBuilder ekon = new StringBuilder();
    string yz = satiral(dizi.ToString());
    string[] Paket = yz.Split();
    for (int i = 0; i < Paket.Length; i++)
    {
    if (Paket[i] != "")
    {
    ekon.Append(Paket[i]);
    ekon.Append(";");
    }
    }
    return ekon.ToString();
    }


    //---------- Burası .2d dosyası okur
    public void AL_Click_1(object sender, EventArgs e)
    {
    bool kutucuk = false;
    bool mesafeKutulari = false;

    if (textBox3.Text == "" || textBox4.Text == "")
    {
    mesafeKutulari = false;
    label7.Visible = true;
    label7.Text = "Mesafe bilgilerini eksik bırakmayınız";
    }
    else
    {
    mesafeKutulari = true;
    }
    if (textBox1.Text == "" || textBox2.Text == "")
    {
    label7.Visible = true;
    label7.Text = "Kaynak dosya ve kayıt yerini boş bırakmayınız";
    }
    else if (checkBox1.Checked == false && checkBox2.Checked == false && checkBox3.Checked == false && checkBox4.Checked == false)
    {
    label7.Visible = true;
    label7.Text = "Kutulardan birini işaretleyiniz";
    }
    else
    {
    int q = 0;
    if (checkBox1.Checked == true)
    {
    q++;
    }
    if (checkBox2.Checked == true)
    {
    q++;
    }
    if (checkBox3.Checked == true)
    {
    q++;
    }
    if (checkBox4.Checked == true)
    {
    q++;
    }

    if (q > 1)
    {
    label7.Visible = true;
    label7.Text = "Birden fazla kutu seçmeyiniz";
    kutucuk = false;
    }
    else
    {
    kutucuk = true;
    }

    //------------------------------------------------------
    if (kutucuk == true)
    {
    if ((textBox3.Visible == true && mesafeKutulari == true) || textBox3.Visible == false)
    {
    label7.Visible = false;
    StreamReader oku;
    string[] metin;
    oku = File.OpenText("" + textBox1.Text);
    string line;
    // Satır boş olana kadar okumaya devam eder.
    int t = 1;
    double y11 = 0, x11 = 0, y12 = 0, x12 = 0, y21=0 , x21=0 , y22=0 , x22=0 ;
    double dy1 = 1, dx1 = 1, dy2 = 1, dx2 = 1;
    double s1 = 1, s2 = 1, E = 1;
    while ((line = oku.ReadLine()) != null)
    {
    metin = Dogrusal(line).Split(';');
    if (t == 1)
    {
    y11 = Convert.ToDouble(metin[0]);
    x11 = Convert.ToDouble(metin[1]);
    //koor[t] = y11.ToString();
    //koor[t + 1] = x11.ToString();
    }
    else if (t == 2)
    {
    y12 = Convert.ToDouble(metin[0]);
    x12 = Convert.ToDouble(metin[1]);
    }
    else if (t == 3)
    {
    y21 = Convert.ToDouble(metin[0]);
    x21 = Convert.ToDouble(metin[1]);
    }
    else if (t == 4)
    {
    y22 = Convert.ToDouble(metin[0]);
    x22 = Convert.ToDouble(metin[1]);
    }
    //--------- Hesap Basliyor -----------//

    dy1 = y12 - y11;
    dx1 = x12 - x11;
    dy2 = y22 - y21;
    dx2 = x22 - x21;

    s1 = Math.Sqrt(dy1 * dy1 + dx1 * dx1);
    s2 = Math.Sqrt(dy2 * dy2 + dx2 * dx2);

    if (s1 != 0 && s2 != 0)
    {
    dy1 = dy1 / s1;
    dx1 = dx1 / s1;
    dy2 = dy2 / s2;
    dx2 = dx2 / s2;
    }

    if (dx1 == 0 || dy1 == 0)
    {
    E = 0;
    }
    else
    {
    E = dy1 / dx1 + dx1 / dy1;
    }

    t++;
    }

    if (textBox3.Visible == false && textBox4.Visible == false)
    {
    Stringer(Math.Round(y11,6), Math.Round(x11,6), Math.Round(dy1,6), Math.Round(dx1,6), Math.Round(E,6));
    }
    else if (textBox3.Visible == true && textBox4.Visible == true)
    {


    if (Convert.ToDouble(textBox3.Text) < Convert.ToDouble(textBox4.Text))
    {
    Stringer(Math.Round(y11, 6), Math.Round(x11, 6), Math.Round(dy1, 6), Math.Round(dx1, 6), Math.Round(E, 6));
    }
    if (Convert.ToDouble(textBox3.Text) > Convert.ToDouble(textBox4.Text))
    {
    label7.Visible = true;
    label7.Text = "1. Mesafe 2.Mesafeden Büyük Olamaz";
    }
    if (Convert.ToDouble(textBox3.Text) == Convert.ToDouble(textBox4.Text))
    {
    label7.Visible = true;
    label7.Text = "1. Mesafe 2.Mesafeye Eşit Olamaz";
    }
    }
    }
    }

    }
    }

    private static string Dogrusal(string dizi)
    {
    StringBuilder ekon = new StringBuilder();
    string yz = satiral(dizi.ToString());
    string[] Paket = yz.Split();
    for (int i = 0; i < Paket.Length; i++)
    {
    if (Paket[i] != "")
    {
    ekon.Append(Paket[i]);
    ekon.Append(";");
    }
    }
    return ekon.ToString();
    }

    private void DSclose_Click_1(object sender, EventArgs e)
    {
    openFileDialog1.Title = "Lütfen Dosyayı Seçiniz";
    openFileDialog1.Filter = "(*.xyz)|*.xyz|(*.txt)|*txt|(*.2D)|*.2d|Tüm dosyalar(*.*)|*.*";
    openFileDialog1.FilterIndex = 4;
    openFileDialog1.InitialDirectory = "";
    openFileDialog1.Multiselect = false;
    openFileDialog1.ShowDialog();
    textBox2.Text = openFileDialog1.FileName.ToString();
    }

    private void filtreOK_Click_1(object sender, EventArgs e)
    {
    GorunurON();

    }

    private void filtreNO_Click_1(object sender, EventArgs e)
    {
    GorunurOFF();

    }
    private void GorunurON()
    {
    textBox3.Visible = true;
    textBox4.Visible = true;
    label5.Visible = true;
    label6.Visible = true;
    filtreNO.Enabled = true;
    filtreOK.Enabled = false;
    }
    private void GorunurOFF()
    {
    textBox3.Visible = false;
    textBox4.Visible = false;
    filtreOK.Visible = true;
    label5.Visible = false;
    label6.Visible = false;
    filtreNO.Enabled = false;
    filtreOK.Enabled = true;

    }


    private void NoktaBulutu_Click_1(object sender, EventArgs e)
    {
    openFileDialog1.Title = "Lütfen Dosyayı Seçiniz";
    openFileDialog1.Filter = "(*.xyz)|*.xyz|(*.txt)|*txt|(*.2D)|*.2d|Tüm dosyalar(*.*)|*.*";
    openFileDialog1.FilterIndex = 0;
    openFileDialog1.InitialDirectory = "";
    openFileDialog1.Multiselect = false;
    openFileDialog1.ShowDialog();
    textBox5.Text = openFileDialog1.FileName.ToString();
    }

    private void DSopen_Click_1(object sender, EventArgs e)
    {
    openFileDialog1.Title = "Lütfen Dosyayı Seçiniz";
    openFileDialog1.Filter = "(*.xyz)|*.xyz|(*.txt)|*txt|(*.2D)|*.2d|Tüm dosyalar(*.*)|*.*";
    openFileDialog1.FilterIndex = 3;
    openFileDialog1.InitialDirectory = "";
    openFileDialog1.Multiselect = false;
    openFileDialog1.ShowDialog();
    textBox1.Text = openFileDialog1.FileName.ToString();
    }


    }
    }



    Acaba daha başka ne yapabilirim?




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.