2012-01-18 10 views
6

मैं जानना चाहता हूं कि text file से तेज़ और स्मार्ट तरीके से पढ़ना संभव है या नहीं।टेक्स्ट फ़ाइल तेज/स्मार्ट से कैसे पढ़ा जाए?

कॉल इस "भाग":

ID:1; 
FIELD1 :someText; 
FIELD2 :someText; 
FIELD3 :someText; 
FIELD4 :someText; 
FIELD5 :someText; 
FIELD6 :someText; 
FIELD7 :someText; 
FIELD8 :someText; 
END_ID : 
01: someData; 
02: someData; 
... 
... 
48: someData; 
ENDCARD: 

मैं एक पाठ फ़ाइल में उनकी संख्या हज़ारों

यह एक text file में मेरे डेटा का एक विशिष्ट स्वरूप है।

क्या यह "भाग" द्वारा "भाग" पढ़ने के लिए LINQ का उपयोग करना संभव है? मैं हर एक लाइन के माध्यम से लूप नहीं करना चाहता।

LINQID:1; से शुरू होने के लिए यह संभव होगा और ENDCARD: पर समाप्त होगा?

string[] lines = System.IO.File.ReadAllLines(SomeFilePath); 

//Cleaning up the text file of unwanted text 
var cleanedUpLines = from line in lines 
        where !line.StartsWith("FIELD1") 
        && !line.StartsWith("FIELD5") 
        && !line.StartsWith("FIELD8") 
        select line.Split(':'); 

//Here i want to LINQtoText "part" by "part" 

//This i do not want to do!!! 
foreach (string[] line in cleanedUpLines) 
{ 
} 

उत्तर

12

ये रहा:

है इस का कारण यह है कि मैं हर "भाग" के लिए एक object बनाना चाहते हैं ...

मेरे मन में कुछ इस तरह था

static void Main() 
{ 
    foreach(var part in ReadParts("Raw.txt")) 
    { // all the fields for the part are available; I'm just showing 
     // one of them for illustration 
     Console.WriteLine(part["ID"]); 
    } 
} 

static IEnumerable<IDictionary<string,string>> ReadParts(string path) 
{ 
    using(var reader = File.OpenText(path)) 
    { 
     var current = new Dictionary<string, string>(); 
     string line; 
     while((line = reader.ReadLine()) != null) 
     { 
      if(string.IsNullOrWhiteSpace(line)) continue; 
      if(line.StartsWith("ENDCARD:")) 
      { 
       yield return current; 
       current = new Dictionary<string, string>(); 
      } else 
      { 
       var parts = line.Split(':'); 
       current[parts[0].Trim()] = parts[1].Trim().TrimEnd(';'); 
      } 
     } 
     if (current.Count > 0) yield return current; 
    } 
} 

यह क्या करता है: एक इटरेटर ब्लॉक बनाएं (एक राज्य मशीन जो पढ़ती है और "उपज" डेटा को पुनरावृत्त करती है; यह पूरी फ़ाइल को एक बार में नहीं पढ़ती है) जो लाइनों को स्कैन करती है; यदि यह कार्ड का अंत है, तो कार्ड "उपज" होता है; अन्यथा यह भंडारण के लिए डेटा को एक शब्दकोश में जोड़ता है।

नोट: यदि आपके पास class है जो डेटा का प्रतिनिधित्व करता है, तो आप नामों के आधार पर मूल्यों को सेट करने के लिए प्रतिबिंब या FastMember जैसे कुछ का उपयोग कर सकते हैं।

यह सीधे LINQ का उपयोग नहीं करता है; तथापि, यह रूप कार्यान्वित किया जाता है एक गणनीय दृश्य है, जो LINQ करने वाली वस्तुओं की निर्माण खंड है, तो आप LINQ साथ इस उपभोग कर सकता है, अर्थात

var data = ReadParts("some.file").Skip(2).First(x => x["ID"] == "123"); 
+0

वाह, यह वास्तव में कमाल का है। धन्यवाद मार्क। =) – Willem

+0

मैं सोच रहा हूं कि इस तरह के एक साफ और संक्षिप्त उत्तर के साथ आप इस प्रश्न को कैसे पढ़ सकते हैं, पढ़ सकते हैं और जवाब दे सकते हैं (संपादन 15 के साथ ठीक है)। – Oliver

+0

@ ओलिवर बहुत सारे LINQ करने की सौजन्य? –

संबंधित मुद्दे