2010-04-07 5 views

Antwort

50

Es gibt eine lines Methode für Strings, die ein Enumerator zurückgibt. Rufen Sie count für den Enumerator auf.

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

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

lines Die Methode wurde in Ruby 1.8.7 eingeführt. Wenn Sie eine ältere Version verwenden, überprüfen Sie die Antworten unter @mipadi und @Greg.

+0

"Hello \ nWorld \ n" .lines.to_a # => ["Hallo \ n", "Welt \ n"] Hinweis, die Zeilenumbrüche werden nicht ignoriert, Sie sind in der Zeile enthalten. –

+0

Greg, ich meine, die allerletzte Zeilenumbruch wird ignoriert, um die Anzahl der Zeilen zu zählen. – Anurag

+0

Dies funktioniert nicht in Ruby 1.8.6. –

5

Eine Möglichkeit wäre, die Anzahl der Zeilenende zu zählen (\n oder \r\n, auf der Saite abhängig), der Nachteil ist, dass, wenn die Zeichenfolge tut nicht Ende in einer neuen Zeile, Sie sicherstellen, müssen würden um eins zu deiner Zählung hinzuzufügen. Man könnte dies mit den folgenden:

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

könnten Sie auch nur eine Schleife durch den String und die Linien zählen:

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

mit dieser Lösung fortsetzen, könnte man wirklich Lust bekommen und verwenden inject:

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

, die die meisten unnötig ist c omplex Lösung Ich habe in zehn Minuten gesehen –

+1

@David: Es ist eine Zeile Code. 'String # Zeilen' ist nicht in allen Versionen von Ruby, wie in einer anderen Antwort erwähnt. – mipadi

+0

IO # readlines ist in den meisten Versionen glaube ich .. –

4

string".split("\n").size funktioniert gut. Ich mag es, dass nachfolgende Zeilen ignoriert werden, wenn sie keinen Inhalt enthalten.

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

Das ist nicht, was Sie vielleicht sein wollen, so verwenden lines() als @Anurag stattdessen vorgeschlagen, wenn Sie alle neuen Linien ehren müssen.

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

IO # readlines macht dies ohne all die Unordnung, aber das obige ist im Grunde, was es tut (minus der Größe/Anzahl Methode) –

+0

Mit Ausnahme der OP will die Anzahl der Zeilen in einem String, nicht eine Datei. –

1

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

String#chomp wird von einem Ende der Leitung zu befreien, wenn es vorhanden ist, und die -1 erlaubt leere Strings.

1

ein Dateiobjekt gegeben (hier in Schienen)

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

gibt die Anzahl der Zeilen

IO # readlines on Strings eine Split-Methode durchführt (IOStrings in diesem Fall) unter Verwendung von Zeilenumbrüchen als Trenn

+0

** um das obige in rails zu tun, muss so etwas ("config.autoload_paths + = Dir [" # {config.root}/lib/**/"]) zu config/application.rb hinzugefügt werden –

1

Dies wird zählen nicht leere Zeilen:

string.split("\n").select{ |line| line != "" }.size 
Verwandte Themen