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
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.
Python ile yeni satır ile ayrılmış dos...
Python: okuma diziye satır satır dosya...
Bir node.js bir defada bir satır dosya...
C# Satır Satır Dosya Okuma...
okurken satır satır dosya git...