2009-12-13 10 views
9

Ruby kullanarak bir dosyayı nasıl açabilirim? BöyleDosya açmak ve sözcük aramak nasıl?

+2

sahip yoluna göre birçok dosya belirtilen dosyada veya cümlenin kelimesini aramak için yardımcı olur En azından bir arama yaptın mı? –

+1

@Mitch: Bir arama yapması gerekmiyor, çünkü aslında aynı soruyu daha önce iki kez sordu. –

+4

@Whoever, bunu kapatmak için oy kullandı: soru sizi rahatsız edebilir (çünkü OP'nin bir kitap veya herhangi bir şeyi arama veya okuma istemesi gerekir), ancak açık ve gerçek bir programlama sorusu. İsterseniz oy verin, ancak SO'nun sorulara yönelik yönergelerini nasıl ihlal ettiğini göremiyorum. Spesifik, en az bir programcı ilgilenmek zorundadır ve yazı net ve basittir (dilbilgisini bir kenara koymak). 'Ayrıntılı' gereksinim zor, ama bence bu soru şu şekilde olması gerektiği kadar ayrıntılı: * Bu programlama dili ile * bu büküm * ile * bu özel şeyi * nasıl yaparım *. – Telemachus

cevap

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

şey yardımcı olabilir:

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

Tüm sunulan çözüm O (n) bir zaman karmaşıklığını var. Basitlik için kelimeyi kontrol etmek için String#include? kullanıyorum. Bunun yerine string=~ regex formunda düzenli bir ifade ile yapılabilir.

Dosyanın tamamını okuyun ve içinde arayın. Dosyanız çok büyükse belleğe tam dosyasını okumak ve sonrasında aramaya başlar gibi

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

, bu, optimal bir çözüm değildir. Hafızanız karmaşıklığı

dosyayı satır satır okuyun ve her satırında arama (n) O

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

dosya çok büyük, ancak çizgiler sabit bir değerle upperbounded edilir biliyorsanız, şimdi O (1) bir bellek karmaşıklığı var. Dosyanın

Oku parçaları ve

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 

Bu varyantta, biz dosyadan equaly büyüklüğünde parçalar okuduğunuz arama. Yani ne olursa olsun dosyanın koşulları nelerdir, bizim bellek karmaşıklığı O (1)

+0

Vay, orijinal sorudan çok daha fazla derinlikte harika bir açıklama. Mini öğretici için çok teşekkürler :) –

+0

Üçüncü/yığın çözümde, aradığınız kelime bir seferde okuduğunuz 1024 bayt sınırını aşarsa bu başarısız olamaz mı? – canhazbits

+1

@canhazbits satır 5, aranan sözcüğün yığın sınırını kapsadığı durumu ele almak için önceki yığının sonunu tutar. Ne kadar tutulur kelime büyüklüğüne bağlıdır. – johannes

0

deneyin mücevher 'search_in_file', bu

İlgili konular