none
bir dosya içerisindeki sayıları büyükten küçüğe doğru sıralamak. RRS feed

  • Soru

  • Merhaba bir amacım bir dosya içerisindeki sayıları büyükten küçüğe doğru sıralamak. Ancak dosya içerisinde birden fazla boşluk olduğu zaman program patlıyor. Resmen kafam durdu yardımlarınızı bekliyorum boşluk olayını nasıl halledebilirim. 

       private void Button3_Click(object sender, EventArgs e)
            {
                OpenFileDialog dialog = new OpenFileDialog();   //dosya seçim ekranı için hazırlık
                StreamReader reader;                            // dosya okuma işlemi için hazırlık

                string line;                          //dosyada okunan satır kontrolu
                string[] ReadText;                   //dosyadaki tüm satırların indexler ile tutulacağı dizi
                int count = 0;                       // okunan dosyadaki satır sayısını bulmak için
                int count2 = 0;                      // dosyada ki toplam sayı adetini bulmak için
                int ValueCount = 0;                 //Value dizisi için index değerleri olacaktır.
                                    
                //dosyadaki tüm sayıların tutulacağı dizi
                float[] Value;
                List<string> list = new List<string>();


                //dosya seçim ekranı

                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    FileInfo dosyabilgisi = new FileInfo(dialog.FileName);
                    dialog.Filter = "Text|*.txt";
                    lblDosya.Text = dosyabilgisi.FullName.ToString();   // dosya yolunun tutulması
                    filePath = lblDosya.Text;                    //dosya yolunun global değişkene atılması
                }  //end if

                reader = File.OpenText(filePath);                      //seçilen dosyanın yüklenmesi

                 /*try
                 {*/

                // satır satır okuma işlemi yapılarak , dosyadaki satır sayısının bulunması
                while ((line = reader.ReadLine()) != null)
                {
                    //sirala.Items.Add(line);
                
                    count++;   //satır sayısının belirlenmesi

                } //end while
                  // string sayisi = Convert.ToString(count);
                  //    sirala.Items.Add(sayisi);
               
                reader.Close();



                //satır sayısını bulmaktaki amacım , her bir satırdaki değerlere ulaşıp bir diziye atmak.

                //bu metod index ile istenilen satıra ulaşmama sağlıyor.filepath  seçtiğimiz
                //dosyanın yolunu atamıştık
                ReadText = System.IO.File.ReadAllLines(filePath, System.Text.Encoding.Default);

                for (int i = 0; i < count; i++)
                {
                    string[] temp;  //burada tanımlamamın nedeni her döngü başında yeniden oluşturulması  , bu sayede üzerine yeniden verilerin yazılabilmesi
                   

                    temp = ReadText[i].Split(' '); // ulaştığım satırı boşluk karakterine göre parcalara ayırıyorum. bu sayede satırda ki her bir değere ulaşmayı planlıyorum
                        for (int a = 0; a < temp.Length; a++)  // tüm satırlardaki toplam sayı adetini bulmaya çalışıyorum.
                        {
                            count2++;          //dosyadaki toplam sayı adedi

                        } //end for a
                    

                    

                } //end for i

                string sayisi = Convert.ToString(count2);
                //sirala.Items.Add(sayisi);
                ////Yukarıda ki kod blogundan amacım  dosyada yer alan toplam sayı adetine ulaşıp, value dizisine boyut ataması yapabilmekti.

                Value = new float[count2];




                ////aynı kod blogunu tekar yazmak her ne kadar kötü ve verimsiz bir kod oluştursa da  şimdilik bu yola başvuracağım.


                //// bu döngüdeki amacım , dosyadaki tüm sayıları bir dizi içerisine atabilmek.
              
                for (int i = 0; i < count; i++)
                {
                    string[] temp2;  //burada tanımlamamın nedeni her döngü başında yeniden oluşturup , bu sayede üzerine yeniden verilerin yazılabilmesi


                    //string sil = ReadText[i].Replace("  ", " ");

                    //string sil2 = sil.Replace("  "," ");

               
                    temp2 = ReadText[i].Split(' '); // ulaştığım satırı boşluk karakterine göre parcalara ayırıyorum.
                                                // bu sayede satırda ki her bir değere ulaşmayı planlıyorum.

                    for (int a = 0; a < temp2.Length; a++)  // satırdaki sayı adetini bulmaya çalışıyorum.
                    {
                        float tmp22 = float.Parse(temp2[a]);
                        Value[ValueCount] = tmp22;

                        ValueCount++;

                    } //end for a
                } //end for i

                //string rsayisi = Convert.ToString(ValueCount);
                //sirala.Items.Add(rsayisi);



                Array.Sort(Value);   // diziyi küçükten büyüpe sıralama
                Array.Reverse(Value); // diziyi tersine çevirme,  yani büyükten küçüğe sıralanır.


                //// bulduğum diziyi listview e atıyorum.
                for (int i = 0; i < ValueCount; i++)
                {
                    sirala.Items.Add(Value[i].ToString());

                }

                //} //end try
                // catch
                // {
                //     // Eğer dosya seçimi/yükleme/okuma işlemlerinde bir hata olursa programın çökmemesi için buraya düşecek.
                //     MessageBox.Show("Error");
                // }
            }


    14 Eylül 2019 Cumartesi 13:49

Yanıtlar

  • private void Button3_Click(object sender, EventArgs e)
    {
    	OpenFileDialog dialog = new OpenFileDialog();   //dosya seçim ekranı için hazırlık
    													//dosyadaki tüm sayıların tutulacağı dizi
    	//dosya seçim ekranı
    	if (dialog.ShowDialog() == DialogResult.OK)
    	{
    		FileInfo dosyabilgisi = new FileInfo(dialog.FileName);
    		dialog.Filter = "Text|*.txt";
    		lblDosya.Text = dosyabilgisi.FullName;   // dosya yolunun tutulması
    
    		var sayilar = File.ReadAllLines(dosyabilgisi.FullName)
    			.SelectMany(l => l.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
    			.Select(l => float.TryParse(l, NumberStyles.Any, new CultureInfo("tr-TR"), out float sayi) ? sayi : 0)
    			.OrderByDescending(l => l);
    
    		//// bulduğum diziyi listview e atıyorum.
    		foreach (var e in sayilar)
    		{
    			sirala.Items.Add(e.ToString());
    		}
    	}  //end if
    }
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    • Yanıt Olarak İşaretleyen ferhat şirin 14 Eylül 2019 Cumartesi 14:50
    14 Eylül 2019 Cumartesi 14:37
    Yanıtlayıcı

Tüm Yanıtlar

  • var Siralisayilar = File.ReadLines(@"txt dosya yolu").Where(x => !String.IsNullOrWhiteSpace(x) ).Select(x=> { return Convert.ToDouble(x); }).OrderBy(x=>x).ToList();
    

    14 Eylül 2019 Cumartesi 14:03
  • Oldukca karmaşık ve gereksiz bir kod olmuş. Keske tam olarak neye ihtiyacınız oldugunu anlatsaydiniz. Dosyanin icerigi hakkında ornek verirseniz daha iyi yardimci olabiliriz. "Ancak dosya içerisinde birden fazla boşluk olduğu zaman program patlıyor" bunu anlayabilmek icin ornek gerekiyor. Bu haliyle kodun ne yapmaya calistigini takip etmek cok zor.


     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    14 Eylül 2019 Cumartesi 14:06
    Yanıtlayıcı
  • Merhaba dosya içeriği şu şekilde, yapmam gereken bu dosyayı bilgisayardan seçip. Büyükten küçüğe doğru sıralamak. Split kullanarak boşluk karakterine göre dizinin elemanlarını alıyorum ancak ikinci boşluk yada 3. boşluk olduğu zaman program çalışmıyor. 

    56   45 6 2 789  
    9 349   -87
    11
    4,34   -198,456
    65
    9,85      45
    -1
       99,456
    877 56     34  4
    

    14 Eylül 2019 Cumartesi 14:12
  • Oldukca karmaşık ve gereksiz bir kod olmuş. Keske tam olarak neye ihtiyacınız oldugunu anlatsaydiniz. Dosyanin icerigi hakkında ornek verirseniz daha iyi yardimci olabiliriz. "Ancak dosya içerisinde birden fazla boşluk olduğu zaman program patlıyor" bunu anlayabilmek icin ornek gerekiyor. Bu haliyle kodun ne yapmaya calistigini takip etmek cok zor.

    Merhaba dosya içeriği şu şekilde, yapmam gereken bu dosyayı bilgisayardan seçip. Büyükten küçüğe doğru sıralamak. Split kullanarak boşluk karakterine göre dizinin elemanlarını alıyorum ancak ikinci boşluk yada 3. boşluk olduğu zaman program çalışmıyor. 

    56   45 6 2 789  
    9 349   -87
    11
    4,34   -198,456
    65
    9,85      45
    -1
       99,456
    877 56     34  4




    14 Eylül 2019 Cumartesi 14:22
  • private void Button3_Click(object sender, EventArgs e)
    {
    	OpenFileDialog dialog = new OpenFileDialog();   //dosya seçim ekranı için hazırlık
    													//dosyadaki tüm sayıların tutulacağı dizi
    	//dosya seçim ekranı
    	if (dialog.ShowDialog() == DialogResult.OK)
    	{
    		FileInfo dosyabilgisi = new FileInfo(dialog.FileName);
    		dialog.Filter = "Text|*.txt";
    		lblDosya.Text = dosyabilgisi.FullName;   // dosya yolunun tutulması
    
    		var sayilar = File.ReadAllLines(dosyabilgisi.FullName)
    			.SelectMany(l => l.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
    			.Select(l => float.TryParse(l, NumberStyles.Any, new CultureInfo("tr-TR"), out float sayi) ? sayi : 0)
    			.OrderByDescending(l => l);
    
    		//// bulduğum diziyi listview e atıyorum.
    		foreach (var e in sayilar)
    		{
    			sirala.Items.Add(e.ToString());
    		}
    	}  //end if
    }
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    • Yanıt Olarak İşaretleyen ferhat şirin 14 Eylül 2019 Cumartesi 14:50
    14 Eylül 2019 Cumartesi 14:37
    Yanıtlayıcı
  • private void Button3_Click(object sender, EventArgs e)
    {
    	OpenFileDialog dialog = new OpenFileDialog();   //dosya seçim ekranı için hazırlık
    													//dosyadaki tüm sayıların tutulacağı dizi
    	//dosya seçim ekranı
    	if (dialog.ShowDialog() == DialogResult.OK)
    	{
    		FileInfo dosyabilgisi = new FileInfo(dialog.FileName);
    		dialog.Filter = "Text|*.txt";
    		lblDosya.Text = dosyabilgisi.FullName;   // dosya yolunun tutulması
    
    		var sayilar = File.ReadAllLines(dosyabilgisi.FullName)
    			.SelectMany(l => l.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
    			.Select(l => float.TryParse(l, NumberStyles.Any, new CultureInfo("tr-TR"), out float sayi) ? sayi : 0)
    			.OrderByDescending(l => l);
    
    		//// bulduğum diziyi listview e atıyorum.
    		foreach (var e in sayilar)
    		{
    			sirala.Items.Add(e.ToString());
    		}
    	}  //end if
    }
    
    Çetin hocam çok çok teşekkür ediyorum c# ile çok haşır neşir değildim, ancak olmam gerekiyor. Yazdığınız kod mükemmel bu tür kodları kolay anlayıp kavramam için kaynak önerebilir misiniz?




    14 Eylül 2019 Cumartesi 14:51
  • Istersen benim blogu en basından (February 2009), sonuna okuyabilirsin:

    Blog adresi

    Cihan Yakar'in LINQ kitabi var, onu alıp okuyabilirsin.

    Internette daha tonlarca kaynak var.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    14 Eylül 2019 Cumartesi 15:05
    Yanıtlayıcı
  • Teşekkürler Takip edeceğim bir kaç kaynak temin etmiştim bunlarda artı olur. 
    14 Eylül 2019 Cumartesi 16:56