2009-12-13 7 views
9

Ruby를 사용하여 파일을 열고 그 안에 단어를 검색하려면 어떻게해야합니까? 이 같은파일을 열고 단어를 검색하는 방법은 무엇입니까?

+2

은이 경로에 의해 많은 파일이 지정된 파일 또는에서 문구의 단어를 검색하는 데 도움이 적어도 수색을 끝냈습니까? –

+1

@Mitch : 검색을 할 필요가 없습니다. 왜냐하면 그는 이전에 똑같은 질문을 실제로 두번이나했기 때문입니다. –

+4

@ 누가 이것을 끝내기로 결심 했는가 : 질문은 당신에게 귀찮게 할 수 있습니다 (OP가 책을 검색하거나 읽으려는 것이기 때문에). 그러나 그것은 분명하고 실제적인 프로그래밍 질문입니다. 원한다면 투표하십시오.하지만 질문에 대한 SO의 지침을 어떻게 위반하는지 보지 못합니다. 구체적으로 말하자면, 적어도 한 프로그래머는 관심을 가져야하고 글쓰기는 명확하고 간단합니다 (문법을 제쳐두고). '자세한'요구 사항은 까다 롭습니다.하지만이 질문은 다음과 같이 자세하게 설명됩니다. *이 프로그래밍 언어 *를 사용하여 *이 트위스트 *를 사용하여 * 특정 작업을 수행하려면 어떻게해야합니까? – Telemachus

답변

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

뭔가 도움이 될 수 있습니다 :

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

모든 제시된 해결책은 O (N)의 시간 복잡도가 있습니다. 편의상 나는 String#include?을 사용하여 단어를 확인합니다. 대신 정규식을 string=~ regex 형태로 사용하여이 작업을 수행 할 수 있습니다.

전체 파일을 읽고 검색하십시오.

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

파일이 매우 큰 경우 전체 파일을 메모리로 읽어서 나중에 검색하기 때문에 최적의 솔루션이 아닙니다. 메모리의 복잡성은

라인하여 파일 라인을 읽고 각 라인에서 검색 (N) O입니다

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

파일이 매우 큰, 그러나 당신이 당신의 선이 일정한 값으로 upperbounded 알고 경우, 이제 O (1)의 메모리 복잡성을 갖습니다. 파일의

읽기 청크와는

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 

이 변형에서, 우리는 파일에서 equaly 크기의 청크를 읽고에서 검색 할 수 있습니다. 그래서 상관없이 파일의 조건이 무엇인지, 우리의 기억의 복잡성은 O입니다 (1)

+0

원래 질문보다 훨씬 더 깊이있는 와우, 훌륭한 설명. 미니 튜토리얼을 이용해 주셔서 감사합니다 :) –

+0

3 번째/청크 해답으로, 찾고있는 단어가 한 번에 읽는 1024 바이트의 경계를 넘어 서면 실패하지 않을 수 있습니까? – canhazbits

+1

@canhazbits 라인 5는 검색된 단어가 청크 경계에 걸쳐있는 경우를 처리하기 위해 이전 청크의 끝을 유지합니다. 얼마나 유지되는지는 단어 크기에 달려 있습니다. – johannes

0

시도 보석 'search_in_file', 당신이

관련 문제