2010-04-07 9 views

risposta

50

C'è un metodo lines per stringhe che restituisce un Enumerator. Chiama count sull'enumeratore.

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

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

Il metodo lines è stato introdotto in Ruby 1.8.7. Se stai utilizzando una versione precedente, controlla le risposte di @mipadi e @Greg.

+0

"Hello \ nWorld \ n" .lines.to_a # => ["Hello \ n", "World \ n"] Nota, le newline non vengono ignorate, sono inclusi con la linea. –

+0

Greg, intendevo che l'ultima riga di nuova riga viene ignorata ai fini del conteggio del numero di righe. – Anurag

+0

Questo non funziona in ruby ​​1.8.6. –

5

Un modo potrebbe essere quello di contare il numero di fine riga (o \n\r\n, a seconda della stringa), l'avvertenza è che se la stringa non non fine a una nuova linea, si dovrà fare in modo per aggiungere uno al tuo conteggio. Si potrebbe farlo con la seguente:

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

Si potrebbe anche solo ciclo attraverso la stringa e contare le righe:

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

Continuando con questa soluzione, si potrebbe ottenere molto di fantasia e utilizzare inject:

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

che è il più inutilmente c soluzione omplex che ho visto in decine di minuti –

+1

@David: è una riga di codice. 'String # lines' non è in tutte le versioni di Ruby, come indicato in un'altra risposta. – mipadi

+0

I read delle IO # sono nella maggior parte delle versioni. –

4

string".split("\n").size funziona bene. Mi piace che ignori le nuove righe finali se non contengono contenuti.

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

che potrebbe non essere ciò che si desidera, in modo da utilizzare come lines() @Anurag suggerito, invece, se avete bisogno di onorare tutte le nuove linee.

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

IO # readlines fa tutto questo senza tutti i problemi, ma quanto sopra è fondamentalmente quello che fa (meno il metodo size/count) –

+0

Tranne che l'OP vuole il numero di nuove righe in una stringa, non un file. –

1

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

String#chomp si libera di un'estremità di linea, se esiste, e il -1 permette stringhe vuote.

1

dato un oggetto file (in questo caso, in rotaie)

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

restituisce il numero di linee

IO # readlines esegue un metodo split su stringhe (IOStrings in questo caso) utilizzando nuove righe come separatore

+0

** per fare quanto sopra in rotaie, qualcosa di simile a questo ("config.autoload_paths + = Dir [" # {config.root}/lib/**/"]") deve essere aggiunto a config/application.rb –

1

Questo non contare righe vuote:

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