Merhabalar arkadaşlar.
Bir uygulama da kullandığım kod parçasını sizlerle de paylaşmak istedim. İçerisinde ki satır sayısı ve toplam sayı adedi bilinmeyen bir txt belge seçip , belgede yer alan sayıları büyükten küçüğe sıralan bir kod. Kod verimsiz gelebilir veya bir takım iyileştirmeler gerekebilir.Ama mantığını anlamanız daha önemli. Satır sayısı ve içerisindeki sayı adedi bilinmeyen belge de , satır ve sayı adedini nasıl bulduğumu anlamanız için gerekli açıklamaları yazdım.
Not:Belge de her bir sayı arası boşluk bir space kadardır.
Örnek olarak kullandığım number.txt belgesinini içeriği
8 7 6 -5 4 9 1
10 45 27 -9 14 15
17
17,5
KOD:
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.
float[] Value; //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.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)
{
count++; //satır
sayısının belirlenmesi
} //end while
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
//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
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.
{
Value[ValueCount] = float.Parse(temp2[a]);
ValueCount++;
} //end for a
} //end for i
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++)
{
lstFileValue.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");
}
Ekran Görüntüsü:
Umarım faydalı olur. Herhangi bir sorunda bana ulaşabilirsiniz. Kolay gelsin..