2010-04-09 24 views
8

मेरे पास सी # में एक स्ट्रिंग है और 65 से कहें, विशिष्ट लाइन से टेक्स्ट प्राप्त करना चाहते हैं। और अगर फ़ाइल में इतनी सारी लाइनें नहीं हैं तो मैं "" प्राप्त करना चाहता हूं। यह कैसे करना है?सी # में एक स्ट्रिंग से विशिष्ट रेखा कैसे प्राप्त करें?

उत्तर

18

त्वरित और आसान, यह मानते हुए \ r \ n या \ N आप अपने स्ट्रिंग पर एक System.IO.StringReader इस्तेमाल कर सकते हैं अपने न्यू लाइन अनुक्रम

string GetLine(string text, int lineNo) 
{ 
    string[] lines = text.Replace("\r","").Split('\n'); 
    return lines.Length >= lineNo ? lines[lineNo-1] : null; 
} 
+0

क्या बजाय Environment.Newline का उपयोग कर के बारे में? –

+2

स्ट्रिंग। स्प्लिट() केवल चार स्वीकार करता है, और यदि आप पर्यावरण को पास करते हैं। न्यूलाइन। तोछारएरे() हर दूसरी लाइन खाली हो जाएगी (संपादित करें: विंडोज़ में, यूनिक्स ठीक काम करेगा) – EventHorizon

+2

स्ट्रिंगस्प्लिटऑप्शन। रीमूवइएक्ट्रीएन्ट्री –

2

यदि आपके पास पहले से एक स्ट्रिंग उदाहरण है, तो आप प्रत्येक पंक्ति को विभाजित करने के लिए String.Split का उपयोग कर सकते हैं और जांच सकते हैं कि लाइन 65 उपलब्ध है और यदि ऐसा है तो इसका उपयोग करें।

यदि सामग्री एक स्ट्रिंग सरणी प्राप्त करने के लिए File.ReadAllLines फ़ाइल का उपयोग करती है और फिर पहले बताई गई एक ही जांच करें। यह छोटी फाइलों के लिए अच्छी तरह से काम करेगा, अगर आपकी फ़ाइल एक समय में एक पंक्ति को पढ़ने पर विचार करें।

using (var reader = new StreamReader(File.OpenRead("example.txt"))) 
{ 
    reader.ReadLine(); 
} 
0

एक विशिष्ट फ़ाइल संरचना और निचले स्तर के फ़ाइल संचालन का लाभ लेने के अलावा, मैं थेरेस किसी भी तेज़ तरीका से, 64 लाइनों को पढ़ने के लिए उन्हें त्यागने और फिर 65 वीं लाइन पढ़ सकते हैं और इसे रखने के नहीं लगता। प्रत्येक चरण में, आप आसानी से जांच सकते हैं कि आपने पूरी फ़ाइल पढ़ ली है या नहीं।

4

है। फिर आप ReadLine() का उपयोग तब तक कर सकते हैं जब तक आप जिस पंक्ति को आप चाहते थे या स्ट्रिंग से बाहर नहीं पहुंचे।

सभी लाइनों एक अलग लंबाई हो सकता था, वहाँ जब आप Split() एक स्ट्रिंग आप इसे नकल है, जो भी स्मृति की खपत दोगुना हो जाएगा सीधे लाइन 65.

के लिए कूद करने के लिए कोई शॉर्टकट है।

0

द स्ट्रिंग। Split ("\ n" .ToCharArray()) [64]

+0

इंडेक्स-आउट-ऑफ-बाउंड त्रुटि के लिए प्रवण – Amsakanna

+0

यह लाइन 65 लौटाएगा, और आपको वातावरण में सभी लौटाई गई लाइनों की शुरुआत में '\ r' मिलेगा, जहां पर्यावरण। न्यूलाइन" \ r \ n "(विंडोज़) है । – EventHorizon

+0

हाँ, मैं उस उत्तर पर जल्दी था। हालांकि सामान्य विचार एक कामकाजी है। सिवाय इसके कि जब यह हजारों लाइनों के तार आता है तो यह धीमा होता है। जब नई लाइनों की बात आती है, तो यह स्ट्रिंग के स्रोत पर निर्भर करता है। अगर यह केवल \ n के बिना लिखा गया है, तो यह काम नहीं करेगा। स्ट्रिंग का प्रारूप पर्यावरण पर निर्भर नहीं है, है ना? नियमित अभिव्यक्ति इस मामले में नौकरी करेगी, लेकिन धीमी है। – AlexanderMP

2

आप क्या कर सकते हैं, न्यूलाइन चरित्र के आधार पर स्ट्रिंग को विभाजित करें।

string[] strLines = yourString.split(Environment.NewLine); 
if(strLines.Length > lineNumber) 
{ 
    return strLines[lineNumber]; 
} 
+0

यह काम नहीं करता है, हम स्ट्रिंग को char [] में परिवर्तित नहीं कर सकते हैं। – savi

6
private static string ReadLine(string text, int lineNumber) 
{ 
    var reader = new StringReader(text); 

    string line; 
    int currentLineNumber = 0; 

    do 
    { 
     currentLineNumber += 1; 
     line = reader.ReadLine(); 
    } 
    while (line != null && currentLineNumber < lineNumber); 

    return (currentLineNumber == lineNumber) ? line : 
               string.Empty; 
} 
संबंधित मुद्दे