Benim basit gereksinim: Büyük (> bir milyon) satır sınama dosyasını okuma (Bu örnekte, bazı türlerde bir CSV olduğunu varsayalım) ve başlangıca bir referans gösterme Gelecekte daha hızlı arama için bu satırın (X'den başlayarak bir satır okuyun).Metin dosyalarını okuma satırı, tam ofset/konum bildirimi ile
Önce StreamWriter
kullanarak ve temeldeki BaseStream.Position
'a erişerek, naif ve kolay yolu denedim. Ben amaçladığı gibi maalesef bu işe yaramazsa:
aşağıdaki
Foo
Bar
Baz
Bla
Fasel
ve bu çok basit bir kod içeren bir dosya Verilen
using (var sr = new StreamReader(@"C:\Temp\LineTest.txt")) {
string line;
long pos = sr.BaseStream.Position;
while ((line = sr.ReadLine()) != null) {
Console.Write("{0:d3} ", pos);
Console.WriteLine(line);
pos = sr.BaseStream.Position;
}
}
çıktısı:
000 Foo
025 Bar
025 Baz
025 Bla
025 Fasel
Akışın faydalı/verimli olmaya çalıştığını ve muhtemelen ne zaman (büyük) yığınlarda okunduğunu hayal edebiliyorum. ew veri gereklidir. Benim için bu kötü ...
Son olarak soru: Temel bir akış kullanmadan satırdan dosya satırı okurken (bayt, char) ofset elde etmenin herhangi bir yolu ve \ r \ n \ r \ n ve dize kodlama vb manuel? mevcut konumu izlemeyi tercih hangi
using (var sr = new StreamReader(@"C:\Temp\LineTest.txt")) {
string line;
long pos = 0;
while ((line = sr.ReadLine()) != null) {
Console.Write("{0:d3} ", pos);
Console.WriteLine(line);
pos += line.Length;
}
}
ile vardı Yardımcı olur, izin verilen minimum tampon, ... emin değilim 128 bayt ama bunu denediğimde daha uzun bir dosyada, elde edebildiğim en kısa pozisyondu. Ben satırbaşıyla farklı türde kabul etmek zorunda çünkü –