2008-09-23 16 views

उत्तर

318

गंभीरता से विलम्बित संपादित करें: यदि आप .NET 4.0 या उपयोग कर रहे हैं बाद में

File वर्ग एक नया ReadLines विधि है जो lazily लालच से उन सब को ReadAllLines की तरह एक सरणी में पढ़ने के बजाय लाइनों विश्लेषण करता है। तो अब आप दोनों क्षमता और साथ संक्षिप्तता हो सकता है:

var lineCount = File.ReadLines(@"C:\file.txt").Count(); 

मूल उत्तर

आप कर रहे हैं भी दक्षता की परवाह नहीं, तो आप बस लिख सकते हैं:

var lineCount = File.ReadAllLines(@"C:\file.txt").Length; 

एक और अधिक कुशल विधि के लिए आप कर सकते हैं:

var lineCount = 0; 
using (var reader = File.OpenText(@"C:\file.txt")) 
{ 
    while (reader.ReadLine() != null) 
    { 
     lineCount++; 
    } 
} 

संपादित करें: दक्षता

कारण के बारे में सवाल के जवाब में मैंने कहा कि दूसरा अधिक कुशल स्मृति के उपयोग के बारे में किया गया था, जरूरी गति नहीं। पहला फ़ाइल फ़ाइल की संपूर्ण सामग्री को सरणी में लोड करता है जिसका अर्थ है कि इसे फ़ाइल के आकार के रूप में कम से कम स्मृति आवंटित करना होगा। दूसरा एक समय में केवल एक पंक्ति को लूप्स करता है, इसलिए इसे एक समय में एक से अधिक लाइन की मेमोरी आवंटित नहीं करना पड़ता है। यह छोटी फ़ाइलों के लिए महत्वपूर्ण नहीं है, लेकिन बड़ी फ़ाइलों के लिए यह एक मुद्दा हो सकता है (यदि आप 32-बिट सिस्टम पर 4 जीबी फ़ाइल में लाइनों की संख्या को आजमाते हैं और पाते हैं, उदाहरण के लिए, जहां बस पर्याप्त नहीं है उपयोगकर्ता-मोड पता स्थान इस सरणी को आवंटित करने के लिए)।

गति के मामले में मैं इसमें बहुत कुछ होने की अपेक्षा नहीं करता। यह संभव है कि ReadAllines के कुछ आंतरिक अनुकूलन हैं, लेकिन दूसरी तरफ इसे स्मृति का एक बड़ा हिस्सा आवंटित करना पड़ सकता है। मुझे लगता है कि छोटी फ़ाइलों के लिए ReadAllLines तेजी से हो सकता है, लेकिन बड़ी फ़ाइलों के लिए काफी धीमी है; हालांकि यह बताने का एकमात्र तरीका स्टॉपवॉच या कोड प्रोफाइलर के साथ मापना होगा।

+0

दूसरी विधि पहले की तुलना में कम प्रदर्शनकारी क्यों है? यह कोड से स्पष्ट नहीं है। – Sklivvz

+0

मेरा आंत महसूस होता है कि पहला तेज हो सकता है, लेकिन यह अनुमान है कि – johnc

+2

छोटा नोट: क्योंकि स्ट्रिंग एक संदर्भ प्रकार है, सरणी सूचकांक के आकार x के आकार का आकार होगा, लेकिन आप सही हैं कि इसे अभी भी पाठ को प्रत्येक स्ट्रिंग ऑब्जेक्ट के रूप में स्टोर करने की आवश्यकता है। –

2

आप इसे तुरंत पढ़ सकते हैं, और काउंटर में वृद्धि कर सकते हैं, टेक्स्ट के साथ कुछ भी नहीं करने के लिए बस एक लूप का उपयोग करें।

+1

सीएसवी फाइलों को संसाधित नहीं करते हैं, यह एक टिप्पणी होना चाहिए, जवाब नहीं। – IamBatman

13

सबसे आसान:

int lines = File.ReadAllLines("myfile").Length; 
1

कैरिएज रिटर्न गिनती/लाइन फ़ीड। मैं यूनिकोड में विश्वास करता हूं कि वे क्रमशः 0x000D और 0x000A हैं। इस तरह आप जितना चाहें उतना कुशल या अक्षम हो सकते हैं, और यह तय कर सकते हैं कि आपको दोनों वर्णों से निपटना है या नहीं

5

यदि आसान हो तो आप कोड की एक रेखा का मतलब समझ सकते हैं जो समझने में आसान है लेकिन प्रति मौका अक्षम है?

string[] lines = System.IO.File.RealAllLines($filename); 
int cnt = lines.Count(); 

शायद यह जानने का सबसे तेज़ तरीका है कि कितनी लाइनें हैं।

तुम भी (यदि आप इसे बफरिंग कर रहे हैं में के आधार पर) कर सकता है

#for large files 
while (...reads into buffer){ 
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine); 
} 

वहाँ अन्य कई तरीके हैं, लेकिन इसके बाद के संस्करण में से एक हैं संभव है कि आप के साथ जाना होगा।

+3

मैं तर्क देता हूं कि यह विधि बहुत अक्षम है; क्योंकि, आप पूरी फ़ाइल को स्मृति में पढ़ रहे हैं, और एक स्ट्रिंग सरणी में, कम नहीं। रीडलाइन का उपयोग करते समय आपको बफर की प्रतिलिपि बनाने की आवश्यकता नहीं है। @GregBeech से जवाब देखें। अपने परेड पर बारिश के लिए खेद है। –

8

यह कम स्मृति का प्रयोग करेंगे, लेकिन शायद ले अब

int count = 0; 
string line; 
TextReader reader = new StreamReader("file.txt"); 
while ((line = reader.ReadLine()) != null) 
{ 
    count++; 
} 
reader.Close(); 
-1

आप "wc .exe" निष्पादन योग्य (UnixUtils के साथ आता है और स्थापना की आवश्यकता नहीं है) एक बाहरी प्रक्रिया के रूप में चलाने शुरू कर सकते हैं। यह विभिन्न लाइन गिनती विधियों का समर्थन करता है (जैसे यूनिक्स बनाम मैक बनाम विंडोज़)।

+0

कोई भी तरीका नहीं है कि यह उपयोगी होने के लिए पर्याप्त तेज़ होगा। एक्जिक्यूटिव को कॉल करने का ओवरहेड एक दोगुना होगा (स्पष्ट असाधारण स्पष्ट है) एक एकल वृद्धि लूप के रूप में। – Krythic

0
try { 
    string path = args[0]; 
    FileStream fh = new FileStream(path, FileMode.Open, FileAccess.Read); 
    int i; 
    string s = ""; 
    while ((i = fh.ReadByte()) != -1) 
     s = s + (char)i; 

    //its for reading number of paragraphs 
    int count = 0; 
    for (int j = 0; j < s.Length - 1; j++) { 
      if (s.Substring(j, 1) == "\n") 
       count++; 
    } 

    Console.WriteLine("The total searches were :" + count); 

    fh.Close(); 

} catch(Exception ex) { 
    Console.WriteLine(ex.Message); 
}   
+3

-1: यह धीमा हो जाएगा, बहुत सारी मेमोरी का उपभोग करेगा और जीसी मुश्किल समय देगा! – ya23

+0

यह धीमा हो जाएगा, बहुत मेमोरी का उपभोग करेगा और जीसी कठिन समय देगा! – Professor

0

एक व्यवहार्य विकल्प है, और एक है कि मैं व्यक्तिगत रूप से इस्तेमाल किया है, फ़ाइल की पहली पंक्ति के लिए अपने स्वयं के हैडर को जोड़ने के लिए किया जाएगा। मैंने यह अपने गेम के लिए एक कस्टम मॉडल प्रारूप के लिए किया था। असल में, मेरे पास एक उपकरण है जो मेरी .obj फ़ाइलों को अनुकूलित करता है, जिस बकवास की आवश्यकता नहीं है, उससे छुटकारा पाता है, उन्हें बेहतर लेआउट में परिवर्तित करता है, और उसके बाद लाइनों, चेहरे, मानक, शिखर, और बनावट यूवी की कुल संख्या लिखता है पहली पंक्ति। मॉडल लोड होने पर उस डेटा को विभिन्न सरणी बफर द्वारा उपयोग किया जाता है।

यह भी उपयोगी है क्योंकि आपको केवल एक बार लोड करने के लिए फ़ाइल को लूप करने की आवश्यकता है, बजाय लाइनों की गिनती करने के बजाय, और फिर आपके बनाए गए बफर में डेटा पढ़ने के लिए।

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