2009-12-13 8 views
9

¿Cómo puedo abrir un archivo y buscar una palabra dentro usando Ruby?¿Cómo abrir un archivo y buscar una palabra?

+2

tienen al menos hiciste una búsqueda? –

+1

@Mitch: No necesita hacer una búsqueda, porque en realidad ha hecho esencialmente la misma pregunta dos veces antes. –

+4

@ Quien votó para cerrar esto: la pregunta puede molestarlo (porque desea que el OP busque o lea un libro o lo que sea), pero es una pregunta de programación clara y real. Vísela si lo desea, pero no veo cómo infringe las pautas de SO para las preguntas. Es específico, al menos un programador seguramente estará interesado y la escritura es clara y simple (dejando de lado la gramática). El requisito 'detallado' es complicado, pero creo que esta pregunta es tan detallada como debe ser: ¿Cómo hago * esta cosa específica * con * este giro *, usando * este lenguaje de programación *? – Telemachus

Respuesta

1
File.readlines(file).each {|l| l.grep(/#{exp_search}/).each {|r| puts file + ' : ' + r}} 
2

Algo como esto podría ayudar:

def word_exists_in_file 
    f = File.open("your_file.txt") #opens the file for reading 
    f.each do line 
     print line 
     if line.match /your_word_to_match/ 
     return true 
     end 
    end 
    false 
end 
28

Toda solución que se presenta tienen una complejidad en tiempo de O (n). Para simplificar uso el String#include? para verificar la palabra. Esto podría hacerse en su lugar con una expresión regular en el formulario string=~ regex.

Lea el archivo completo y busque en él.

File.read(filename).include?(word) 

Si el archivo es muy grande, esto no es una solución óptima, como era de leer el archivo completo en la memoria y empieza a buscar después. Su complejidad memoria es O (n)

Leer el archivo línea por línea y buscar en cada línea

File.open(filename) do |f| 
    f.any? do |line| 
    line.include?(word) 
    end 
end 

Si el archivo es muy grande, pero ya se sabe sus líneas se upperbounded por un valor constante, se ahora tiene una complejidad de memoria de O (1).

leer fragmentos del archivo y buscar en ella

File.open(filename) do |f| 
    tmp= f.read(1024) 
    next true if tmp.include?(word) 
    until f.eof? 
    tmp= tmp[(-1*word.size)..-1] + f.read(1024) 
    next true if tmp.include?(word) 
    end 
    next false 
end 

En esta variante, estamos leyendo trozos equaly tamaño del archivo. Así que no importa cuáles sean las condiciones del archivo son, nuestra complejidad de memoria es O (1)

+0

Guau, gran explicación con mucha más profundidad que la pregunta original. Muchas gracias por el mini tutorial :) –

+0

En la tercera/solución fragmentada, ¿no podría fallar si la palabra que estás buscando abarcó el límite de los 1024 bytes que estás leyendo a la vez? – canhazbits

+1

@canhazbits línea 5 mantiene el final del fragmento anterior para manejar el caso donde la palabra buscada abarca el límite del fragmento. Cuánto se guarda depende del tamaño de la palabra. – johannes

0

Try joya 'search_in_file', que le ayuda a buscar la palabra de la frase en el archivo especificado o en muchos archivos por ruta

Cuestiones relacionadas