2009-03-11 12 views

Respuesta

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

Esto carga todo el archivo en la memoria. Si está tratando con archivos de gran tamaño, prefiera sorberlos.
Eso significa cargar una línea a la vez, en lugar de todo el archivo.

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

Es una buena práctica para limpiar después de ti mismo en lugar de dejar que el recolector de basura manejarlo en algún momento. Esto es más importante si su programa es de larga duración y no solo un script rápido. El uso de un bloque de código garantiza que el objeto File se cierre cuando finaliza el bloque.

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

Esto realmente filtra un descriptor de archivo que podría causar un problema grave. Aquí hay una alternativa más limpia que cerrará el archivo después de ser utilizado.'open ('some.txt') {| f | f.grep (/ string /)} ' –

+14

Y también lleva a cargar todo el archivo en la memoria. 'open (" some.txt ") {| f | f.each_line.detect {| line | /re/.match(line)}} ' – rewritten

+2

-1 porque por alguna razón devuelve falso cuando debería ser cierto. Investigando por qué. – kgpdeveloper

10

grep for foo O bar O baz, robado de ruby1line.txt.

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

El enlace parece estar roto, ¿es esto un espejo? 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

funcionó para mí. ¡Gracias! – Mamun

3

Pues parece eed3si9n tiene un trazador de líneas abajo, aquí está la solución a más largo:

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

Debe citar el nombre de su archivo. –

+0

sí acabo de notar mientras publicaste este –

+1

one-liner: 'lo que sea (x) si File.read (" file.txt ") = ~/regex /' – rampion

3

Si su sistema operativo tiene un paquete grep, se puede utilizar una llamada al sistema:

system("grep meow cat_sounds.txt") 

Esto devolverá verdadero si grep devuelve algo, falso si no lo hace.

Si se encuentra en un sistema con grep, puede encontrar que esta es la "mejor" forma porque Ruby puede ser lento cuando se trata de operaciones de archivos.

+2

no ha especificado su sistema operativo todavía = \ –

+13

Creo que es mejor asumir que está cuerdo. –

+0

Curiosamente, era un archivo de búsqueda que estaba creando cuando surgió esta pregunta, así que incluso puedo volver a factorizar esto para sh "grep meow cat_sounds.txt" :-) – ChrisInCambo

0

Esto lee el archivo sólo a la primera aparición de 'cadena' y procesa línea por línea - no leer todo el archivo a la vez.

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