2009-03-11 16 views

risposta

40
File.open(filename).grep(/string/) 

Carica l'intero file in memoria. Se hai a che fare con file di grandi dimensioni, preferisceli delirarli.
Ciò significa caricare una riga alla volta, anziché l'intero file.

File.foreach(filename).grep(/string/) 

E 'buona norma pulire dopo te stesso piuttosto che lasciare gestire il garbage collector ad un certo punto. Questo è più importante se il tuo programma è di lunga durata e non solo uno script veloce. L'utilizzo di un blocco di codice garantisce che l'oggetto File venga chiuso quando il blocco termina.

File.foreach(filename) do |file| 
    file.grep(/string/) 
end 
+45

In questo modo viene rilevato un descrittore di file che potrebbe causare un problema grave. Ecco un'alternativa più pulita che chiuderà il file dopo l'uso.'open ('some.txt') {| f | f.grep (/ string /)} ' –

+14

E porta anche a caricare l'intero file in memoria. 'open (" some.txt ") {| f | f.each_line.detect {| line | /re/.match(line)}} – rewritten

+2

-1 perché per qualche motivo restituisce false quando dovrebbe essere vero. Indagare perché. – kgpdeveloper

10

grep for foo OR bar O baz, rubato da ruby1line.txt.

$ ruby -pe 'next unless $_ =~ /(foo|bar|baz)/' < file.txt 
+0

Link sembra rotto, è uno specchio? http://www.das-labor.org/svn/ruby/sandbox/oneliner.txt –

+1

Ruby oneliner http://reference.jumpingmonkey.org/programming_languages/ruby/ruby-one-liners.html#h5 @dimitris mistriotis – sanjee

+0

ha funzionato per me. Grazie! – Mamun

3

Beh, sembra eed3si9n ha uno di linea verso il basso, ecco la soluzione più a lungo:

f = File.new("file.txt") 
text = f.read 
if text =~ /string/ then 
#relevant code 
end 
+0

È necessario citare il nome del file. –

+0

yeah ha appena notato che hai postato questo one-liner –

+1

: "qualunque sia (x) se File.read (" file.txt ") = ~/regex /' – rampion

3

Se il sistema operativo ha un pacchetto grep, è possibile utilizzare una chiamata di sistema:

system("grep meow cat_sounds.txt") 

Restituisce true se grep restituisce qualcosa, false se non lo fa.

Se ti trovi su un sistema con grep, potresti trovare che questo è il modo "migliore" perché Ruby può essere lento quando si tratta di operazioni sui file.

+2

non ha ancora specificato il suo os = \ –

+13

Penso che sia meglio Supponiamo che sia sano di mente. –

+0

È stato abbastanza divertente essere uno rakefile che stavo creando quando ho trovato questa domanda, quindi posso anche ridimensionarlo a sh "grep meow cat_sounds.txt" :-) – ChrisInCambo

0

Questa legge il file solo per la prima apparizione di 'stringa' e lo elabora riga per riga - non leggere l'intero file in una sola volta.

def file_contains_regexp?(filename,regexp) 
    File.foreach(filename) do |line| 
    return true if line =~ regexp 
    end 
    return false 
end 
Problemi correlati