C# - Büyük boyutlu bir .csv dosyasındaki eksik verileri düzeltme

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.

ID StreetAlleyNeighborhoodYearBuiltSalePrice
1 PaveN/ACollgCr2003 208500
2 GrvlN/AVeenker2005181500
3 PaveN/ASomerst1976 150500
4 PavePaveSawyer1990 250000
5 Grvl GrvlCollgCr 2000 129000
[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:

ID StreetAlleyNeighborhoodYearBuiltSalePrice
1 1012003 208500
22022005181500
3 1031976 150500
4 1131990 250000
5 2 21 2000 129000
[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.

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.
 
Uyarı! Bu konu 8 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı