2010-04-07 11 views

उत्तर

50

तारों के लिए lines विधि है जो Enumerator लौटाती है। गणनाकर्ता पर count पर कॉल करें।

str = "Hello\nWorld" 
str.lines.count # 2 

str = "Hello\nWorld\n" # trailing newline is ignored 
str.lines.count # 2 

lines विधि रूबी 1.8.7 में पेश किया गया था। यदि आप पुराने संस्करण का उपयोग कर रहे हैं, तो @ mipadi और @Greg द्वारा उत्तरों को चेकआउट करें।

+0

"n हैलो \ Nworld \", वे लाइन के साथ शामिल हैं। –

+0

ग्रेग, मेरा मतलब है कि लाइनों की संख्या गिनने के प्रयोजनों के लिए आखिरी नई लाइन को नजरअंदाज कर दिया गया है। – Anurag

+0

यह रूबी 1.8.6 में काम नहीं करता है। –

5

एक तरह से (, स्ट्रिंग के आधार पर \n या \r\n) लाइन अंत की संख्या गिनती करने के लिए, हो सकता है चेतावनी है कि यदि स्ट्रिंग एक नई लाइन में नहीं अंत करता है, आप यह सुनिश्चित करना होगा अपनी गिनती में एक जोड़ने के लिए। आप निम्न के साथ ऐसा कर सकता है:

c = my_string.count("\n") 
c += 1 unless c[-1,1] == "\n" 

आप, साथ ही स्ट्रिंग के माध्यम से लूप और लाइनों गिनती कर सकते हैं:

c = 0 
my_string.each { |line| c += 1 } 

कि समाधान के साथ सतत, तुम सच में फैंसी मिल सकता है और प्रयोग inject:

c = my_string.each.inject(0) { |count, line| count += 1 } 
+0

है यही कारण है कि सबसे अनावश्यक रूप से ग ओमप्लेक्स समाधान मैंने मिनटों में देखा है –

+1

@ डेविड: यह कोड की एक पंक्ति है। रूबी के सभी संस्करणों में 'स्ट्रिंग # लाइन' नहीं है, जैसा कि किसी अन्य उत्तर में उल्लेख किया गया है। – mipadi

+0

आईओ # readlines .. .lines.to_a # => [ "नमस्ते \ n", "विश्व \ n"] ध्यान दें, नई-पंक्तियों को नजरअंदाज नहीं कर रहे हैं अधिकांश संस्करणों मुझे लगता है कि में है –

4

string".split("\n").size अच्छी तरह से काम करता है। मुझे लगता है कि अगर वे सामग्री नहीं रखते हैं तो यह पीछे की नई लाइनों को अनदेखा करता है।

"Hello\nWorld\n".split("\n") # => ["Hello", "World"] 
"hello\nworld\nfoo bar\n\n".split("\n").size # => 3 

नहीं हो सकता है कि आप क्या चाहते हैं, तो के रूप में @Anurag सुझाव बजाय यदि आप सभी नए लाइनों को सम्मानित करने की जरूरत है lines() का उपयोग करें।

"hello\nworld\nfoo bar\n\n".lines.count # => 4 
+0

आईओ # रीडलाइन यह सब गड़बड़ के बिना करता है, लेकिन उपरोक्त मूल रूप से यह करता है (आकार/गिनती विधि घटाएं) –

+0

सिवाय इसके कि ओपी एक स्ट्रिंग में नई लाइनों की संख्या चाहता है, फाइल नहीं। –

1

"hello\nworld\nfoo bar\n\n".chomp.split("\n",-1).size # => 4

String#chomp लाइन के अंत से छुटकारा मिलता है अगर यह मौजूद है, और -1 रिक्त स्ट्रिंग अनुमति देता है।

1

एक फ़ाइल वस्तु (यहाँ, रेल में)

file = File.open(File.join(Rails.root, 'lib', 'file.json')) 
file.readlines.count 

दिया

आईओ # readlines एक विभाजन (इस मामले में IOStrings) तारों पर विधि करता है लाइनों की संख्या विभाजक के रूप में नई-पंक्तियों का उपयोग कर देता है

+0

** रेल में उपरोक्त करने के लिए, इस तरह कुछ ("config.autoload_paths + = Dir [" # {config.root}/lib/**/"]") को config/application.rb में जोड़ा जाना चाहिए –

1

यह गिनती नहीं होगी रिक्त लाइनों:

string.split("\n").select{ |line| line != "" }.size 
संबंधित मुद्दे

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