के साथ लाइन द्वारा टेक्स्ट फ़ाइलों को लाइन पढ़ना मेरी सरल आवश्यकता: एक विशाल (> एक मिलियन) लाइन परीक्षण फ़ाइल पढ़ना (इस उदाहरण के लिए मान लें कि यह किसी प्रकार का सीएसवी है) और शुरुआत के संदर्भ में भविष्य में तेज़ी से लुकअप के लिए उस रेखा का (एक्स पर शुरू होने वाली रेखा पढ़ें)।सटीक ऑफसेट/स्थिति रिपोर्टिंग
मैंने StreamWriter
का उपयोग करके और अंतर्निहित BaseStream.Position
का उपयोग करके पहले बेवकूफ और आसान तरीका की कोशिश की। दुर्भाग्य है कि के रूप में मैं इरादा काम नहीं करता:
निम्नलिखित
Foo
Bar
Baz
Bla
Fasel
और इस बहुत ही सरल कोड युक्त एक फ़ाइल को देखते हुए
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;
}
}
उत्पादन होता है:
000 Foo
025 Bar
025 Baz
025 Bla
025 Fasel
मैं कल्पना कर सकता हूं कि धारा सहायक/कुशल होने की कोशिश कर रही है और संभवतः जब भी एन (बड़े) भाग में पढ़ती है ईडब्ल्यू डेटा आवश्यक है। मेरे लिए यह बुरा है ..
प्रश्न, आखिरकार: मूल स्ट्रीम का उपयोग किए बिना लाइन लाइन को पढ़ने के दौरान (बाइट, चार) ऑफसेट प्राप्त करने का कोई तरीका \ r \ n \ r \ n और मैन्युअल रूप से स्ट्रिंग एन्कोडिंग आदि? , वर्तमान स्थिति ट्रैक करना चाहते हैं जो
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;
}
}
के साथ थे, न्यूनतम बफर अनुमति 128 बाइट्स यकीन नहीं अगर यह मदद मिलेगी, है ... लेकिन जब मैंने कोशिश की तो एक लंबी फ़ाइल पर, यह सबसे छोटी स्थिति थी जिसे मैं प्राप्त कर सकता था। दुर्भाग्यवश –