SORU
13 AĞUSTOS 2009, PERŞEMBE


C# Satır Satır Dosya Okuma

Her satırın işlenmesi gereken bazı metin dosyaları, okumaya çalışıyorum. Şu anda sadece bir StreamReader kullanarak, ve sonra tek tek her satırı okuyorum.

Daha verimli bir şekilde (LoC açısından ve okunabilirlik) bunu yapmak için olup olmadığını operasyonel verimliliği ödün vermeden ETMENİZ kullanarak merak ediyorum. Ben gördüğüm örnekler belleğe tüm dosya yükleme dahil, ve daha sonra işleme. Bu durum ancak çok etkili olacağını sanmıyorum. Dosyaları bilgi alabileceğiniz ilk örnek, 50 bin, ikinci örnekte, dosyanın tüm satırları (boyutları genellikle < 10k) okunması gerekir.

Gerçekten bu küçük dosyalar için bir önemi yok günümüzde, ancak bu yaklaşım, bu tür verimsiz kod yol açar inanıyorum söyleyebiliriz.

Zaman ayırdığınız için teşekkürler!

İlk örnek:

// open file
using(var file = System.IO.File.OpenText(_LstFilename))
{
    // read file
    while (!file.EndOfStream)
    {
        String line = file.ReadLine();

        // ignore empty lines
        if (line.Length > 0)
        {
            // create addon
            T addon = new T();
            addon.Load(line, _BaseDir);

            // add to collection
            collection.Add(addon);
        }
    }
}

İkinci örnek:

// open file
using (var file = System.IO.File.OpenText(datFile))
{
    // compile regexs
    Regex nameRegex = new Regex("IDENTIFY (.*)");

    while (!file.EndOfStream)
    {
        String line = file.ReadLine();

        // check name
        Match m = nameRegex.Match(line);
        if (m.Success)
        {
            _Name = m.Groups[1].Value;

            // remove me when other values are read
            break;
        }
    }
}

CEVAP
13 AĞUSTOS 2009, PERŞEMBE


SERİ tabanlı bir çizgi okuyucu oldukça kolay bir yineleyici bloğu kullanarak yazabilirsiniz:

static IEnumerable<SomeType> ReadFrom(string file) {
    string line;
    using(var reader = File.OpenText(file)) {
        while((line = reader.ReadLine()) != null) {
            SomeType newRecord = /* parse line */
            yield return newRecord;
        }
    }
}

ya Jon mutlu etmek için:

static IEnumerable<string> ReadFrom(string file) {
    string line;
    using(var reader = File.OpenText(file)) {
        while((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}
...
var typedSequence = from line in ReadFrom(path)
                    let record = ParseLine(line)
                    where record.Active // for example
                    select record.Key;

o zaman tampon olmadan tembel değerlendirdi dizisi Where vb için mükemmel ReadFrom(...) var.

Not kullanırsanız OrderBy standart GroupBy, o-ecek var arabellek veri bellek; eğer ihtiyaç gruplandırma ve toplama, "PushLİNQ" süslü kodu için izin gerçekleştirmek için toplamalardan verileri ama atmak (ara belleğe alma). Jon açıklaması is here.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • steven johns

    steven johns

    11 Mart 2011