samaritan
Hectopat
- Katılım
- 11 Kasım 2016
- Mesajlar
- 25
Daha fazla
- Cinsiyet
- Erkek
Öncelikle herkese kolay gelsin.
Sorum şu: Elimde yaklaşık 1400 satır, 80 sütunluk bir .csv dosyası var. Dosyanın içeriği kısaca, belirli bir bölgedeki konutların özellikleri ve bu özellikler ışığında konutların ortalama satış değerleri.
[TBODY]
[/TBODY]Verilerin küçük bir bölüm yukarıdaki şekilde.
Amacım bu veri kümesi üzerinde sayısal işlemler yapmak. Kullanacağım algoritma ise sadece sayısal değerler üzerinden işlem yapabilmekte.
Yani elimdeki metinsel ifadeleri (Grvl, Pave, CollgCr, vb.) sembolik sayısal değerlere çevirmem lazım. Ulaşmak istediğim tablo şu şekilde:
[TBODY]
[/TBODY]Yani her sütundaki değerler kendi aralarında 1'den başlayıp artacak şekilde numaralandırılmalı. N/A değerler de 0 (sıfır) olmalı.
Bu işlemler için ben bir algoritma oluşturdum fakat bir sıkıntı var.
Her bir sütundaki metinsel değerler sayısala çeviriliyor fakat, aynı sütunda bulunan aynı metinsel değerlere, örnek: Street sütunu birden fazla 'Pave' değeri var, farklı sayılar atanıyor. Yani 1. satırdaki 'Pave' değerine 1 atanıyor, 3. satırdaki 'Pave' değerine ise 3 değeri atanıyor. Halbuki ona da 1 değeri atanmalı.
Benim yazmış olduğum kod aşağıda. Soru biraz uzun oldu farkındayım fakat zamanı olup bana yardımcı olan biri çıkarsa çok memnun olurum. Şimdiden vakit ayıran herkese teşekkürler.
[GÜNCELLEME]
Konuyu biraz araştırdım. Bir arkadaştan aldığım fikir sonucu şöyle bir çözüm düşündüm.
'Metinsel ifadeleri sayısal ifadelere çevirme' sorununun çözümü aslında verileri ASCII kodlarına çevirmekmiş.
Yani string ifadelerin yerine, sayısal olarak onların ASCII karşılıklarını yazabiliriz. Bunun için kullandığım yöntem şu:
'System.Text.Encoding' sınıfının altındaki ASCII.GetBytes() fonksiyonunu kullandım. Bu fonksiyon parametre olarak string değer alıp geriye ifadenin ASCII karşılığını byte[] olarak döndürüyor.
Bu byte array'in her bir elemanını StringBuilder sınıfından ürettiğim bir nesneye Append() metoduyla ekledim.
Olayı bir örnek ile açıklayayım:
Metin => Grvl
ASCII karşılığı => G:71, r:114, v:118, l:108
ASCII.GetBytes() fonksiyonunun döndürdüğü byte dizisi şu şekilde olacak:
byte[] = { 71,114,118,108 }
Append() metodu ise bunu StringBuilder'dan üretilmiş nesneye şu şekilde yazacak:
StringBuilder ascii_string = "71113118108";
Ve bu değer veri kümemize geri yazılacak.
Sonuç olarak ulaşmak istediğimiz hedefe varmış olduk.
Kodun bir kısmı aşağıda. Kod bir projenin küçük bir kısmı, proje tamamlanınca kodun tamamını paylaşacağım.
Sorum şu: Elimde yaklaşık 1400 satır, 80 sütunluk bir .csv dosyası var. Dosyanın içeriği kısaca, belirli bir bölgedeki konutların özellikleri ve bu özellikler ışığında konutların ortalama satış değerleri.
ID | Street | Alley | Neighborhood | YearBuilt | SalePrice |
1 | Pave | N/A | CollgCr | 2003 | 208500 |
2 | Grvl | N/A | Veenker | 2005 | 181500 |
3 | Pave | N/A | Somerst | 1976 | 150500 |
4 | Pave | Pave | Sawyer | 1990 | 250000 |
5 | Grvl | Grvl | CollgCr | 2000 | 129000 |
Amacım bu veri kümesi üzerinde sayısal işlemler yapmak. Kullanacağım algoritma ise sadece sayısal değerler üzerinden işlem yapabilmekte.
Yani elimdeki metinsel ifadeleri (Grvl, Pave, CollgCr, vb.) sembolik sayısal değerlere çevirmem lazım. Ulaşmak istediğim tablo şu şekilde:
ID | Street | Alley | Neighborhood | YearBuilt | SalePrice |
1 | 1 | 0 | 1 | 2003 | 208500 |
2 | 2 | 0 | 2 | 2005 | 181500 |
3 | 1 | 0 | 3 | 1976 | 150500 |
4 | 1 | 1 | 3 | 1990 | 250000 |
5 | 2 | 2 | 1 | 2000 | 129000 |
Bu işlemler için ben bir algoritma oluşturdum fakat bir sıkıntı var.
Her bir sütundaki metinsel değerler sayısala çeviriliyor fakat, aynı sütunda bulunan aynı metinsel değerlere, örnek: Street sütunu birden fazla 'Pave' değeri var, farklı sayılar atanıyor. Yani 1. satırdaki 'Pave' değerine 1 atanıyor, 3. satırdaki 'Pave' değerine ise 3 değeri atanıyor. Halbuki ona da 1 değeri atanmalı.
Benim yazmış olduğum kod aşağıda. Soru biraz uzun oldu farkındayım fakat zamanı olup bana yardımcı olan biri çıkarsa çok memnun olurum. Şimdiden vakit ayıran herkese teşekkürler.
Kod:
for (int i = 0; i < (satirSayisi-1); i++) // önce satır okunuyor
{
var satir = dosyaOkuyucu.ReadLine(); // StreamReader ile dosya okuma işlemi[/INDENT]
sayisalDeger = 1; // her sütun başlangıcında atanacak değer 1 yapılıyor[/INDENT]
for (int j = 0; j < (sutunSayisi-1); j++) // sonra sütun okunuyor
{
// .csv dosyasında değerler ',' (virgül) ile ayrıldığı için veriler bu fonksiyonla ayrılıyor
var degerler = satir.Split(',');
veriler[i,j] = degerler[j]; // dosyadan okunan her bir değer bir matrise aktarılıyor
if(IsNumeric(degerler[j]) == false) // eğer okunan değer sayısal değilse
{
veriler[i, j] = sayisalDeger.ToString(); // matrise sayısalDeger değişkeninin değeri atanıyor
sayisalDeger++;
}
islemSayisi++;
}
}
[GÜNCELLEME]
Konuyu biraz araştırdım. Bir arkadaştan aldığım fikir sonucu şöyle bir çözüm düşündüm.
'Metinsel ifadeleri sayısal ifadelere çevirme' sorununun çözümü aslında verileri ASCII kodlarına çevirmekmiş.
Yani string ifadelerin yerine, sayısal olarak onların ASCII karşılıklarını yazabiliriz. Bunun için kullandığım yöntem şu:
'System.Text.Encoding' sınıfının altındaki ASCII.GetBytes() fonksiyonunu kullandım. Bu fonksiyon parametre olarak string değer alıp geriye ifadenin ASCII karşılığını byte[] olarak döndürüyor.
Bu byte array'in her bir elemanını StringBuilder sınıfından ürettiğim bir nesneye Append() metoduyla ekledim.
Olayı bir örnek ile açıklayayım:
Metin => Grvl
ASCII karşılığı => G:71, r:114, v:118, l:108
ASCII.GetBytes() fonksiyonunun döndürdüğü byte dizisi şu şekilde olacak:
byte[] = { 71,114,118,108 }
Append() metodu ise bunu StringBuilder'dan üretilmiş nesneye şu şekilde yazacak:
StringBuilder ascii_string = "71113118108";
Ve bu değer veri kümemize geri yazılacak.
Sonuç olarak ulaşmak istediğimiz hedefe varmış olduk.
Kodun bir kısmı aşağıda. Kod bir projenin küçük bir kısmı, proje tamamlanınca kodun tamamını paylaşacağım.