2009-03-11 42 views
37

Tiêu đề nói cho chính nó thực sự. Tôi chỉ muốn biết nếu nó tồn tại, không phải nó ở đâu. Có một lớp lót để đạt được điều này?Cách tốt nhất để tìm kiếm một chuỗi trong một tệp là gì?

+0

xin lỗi, tôi thích câu hỏi của bạn, nhưng, vui lòng đổi tên nó. Tôi đã được nắm bắt trong 'phát hiện 'chức năng đặc biệt (trở về yếu tố đầu tiên, không phải tất cả, uh) – gaussblurinc

Trả lời

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

Thao tác này tải toàn bộ tệp vào bộ nhớ. Nếu bạn đang xử lý các tệp lớn, hãy thích sử dụng chúng.
Điều đó có nghĩa là tải từng dòng một, thay vì toàn bộ tệp.

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

Thực hành tốt để tự dọn dẹp sau khi thay vì để người thu gom rác xử lý nó tại một thời điểm nào đó. Điều này quan trọng hơn nếu chương trình của bạn tồn tại lâu dài và không chỉ là một số kịch bản nhanh. Sử dụng một khối mã đảm bảo rằng đối tượng File được đóng khi khối kết thúc.

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

Điều này thực sự rò rỉ một bộ mô tả tập tin có thể gây ra một vấn đề nghiêm trọng. Đây là một thay thế sạch hơn sẽ đóng tập tin sau khi nó được sử dụng.'open ('some.txt') {| f | f.grep (/ string /)} ' –

+14

Và cũng dẫn đến tải toàn bộ tệp trong bộ nhớ. 'open (" some.txt ") {| f | f.each_line.detect {| line | /re/.match(line)}} ' – rewritten

+2

-1 vì một số lý do nó trả về false khi nó đúng. Điều tra lý do tại sao. – kgpdeveloper

10

grep cho foo HOẶC thanh HOẶC baz, bị đánh cắp từ ruby1line.txt.

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

Liên kết có vẻ bị hỏng, đây có phải là một tấm gương không? 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

đã làm việc cho tôi. Cảm ơn! – Mamun

3

Cũng có vẻ như eed3si9n có lót xuống, đây là giải pháp dài hơn:

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

Bạn cần báo giá tên tệp của mình. –

+0

vâng, chỉ cần chú ý khi bạn đăng –

+1

một lớp lót: 'bất cứ điều gì (x) nếu File.read (" file.txt ") = ~/regex /' – rampion

3

Nếu hệ điều hành của bạn có một gói grep, bạn có thể sử dụng một cuộc gọi hệ thống:

system("grep meow cat_sounds.txt") 

Điều này sẽ trả về true nếu grep trả về bất cứ điều gì, sai nếu không.

Nếu bạn thấy mình trên một hệ thống với grep, bạn có thể thấy đây là cách "tốt nhất" vì Ruby có thể chậm khi nói đến hoạt động của tệp.

+2

anh ta chưa chỉ định os của mình chưa = \ –

+13

Tôi nghĩ tốt nhất là giả sử anh ta lành mạnh. –

+0

Vui vẻ đủ nó là một rakefile tôi đã tạo ra khi tôi đưa ra câu hỏi này, vì vậy tôi thậm chí có thể tái yếu tố này để sh "grep meow cat_sounds.txt" :-) – ChrisInCambo

0

này đọc các tập tin chỉ với sự xuất hiện đầu tiên của 'string' và xử lý nó từng dòng - không đọc toàn bộ tập tin cùng một lúc.

def file_contains_regexp?(filename,regexp) 
    File.foreach(filename) do |line| 
    return true if line =~ regexp 
    end 
    return false 
end 
Các vấn đề liên quan