2009-03-11 4 views
37

Название говорит само за себя. Я только хочу знать, существует ли она, а не там, где она есть. Есть ли один лайнер для достижения этого?Каков наилучший способ поиска строки в файле?

+0

извините, мне понравился ваш вопрос, но, пожалуйста, переименуйте его. Я был пойман в функции функции «обнаружить» (возврат первого элемента, не все, мм) – gaussblurinc

ответ

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

Это загружает весь файл в память. Если вы имеете дело с большими файлами, предпочитайте их разрывать.
Это означает, что загрузка одной строки за раз, а не весь файл.

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

Это хорошая практика, чтобы очистить после себя, а не позволить сборщику мусора обрабатывать его в какой-то момент. Это более важно, если ваша программа долговечна, а не просто быстрый скрипт. Использование блока кода гарантирует, что объект File будет закрыт, когда блок завершится.

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

Это фактически утечка дескриптора файла, который может вызвать серьезную проблему. Вот более чистая альтернатива, которая закроет файл после его использования.'open ('some.txt') {| f | f.grep (/ string /)} ' –

+14

А также приводит к загрузке всего файла в память. 'open (" some.txt ") {| f | f.each_line.detect {| line | /re/.match(line)}} ' – rewritten

+2

-1, потому что по какой-то причине он возвращает false, когда он должен быть истинным. Изучение причин. – kgpdeveloper

10

grep for foo OR bar ИЛИ baz, украденный от ruby1line.txt.

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

Ссылка кажется сломанной, это зеркало? 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

работал для меня. Благодаря! – Mamun

3

Ну, кажется eed3si9n имеет один лайнер вниз, вот уже решение:

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

Вам нужно указать ваше имя файла. –

+0

Да, только что заметил, когда вы разместили этот –

+1

однострочный: 'независимо (x), если File.read (" file.txt ") = ~/regex /' – rampion

3

Если ваша операционная система имеет пакет Grep, вы могли бы использовать системный вызов:

system("grep meow cat_sounds.txt") 

Это вернет true, если grep ничего не возвращает, если это не так.

Если вы обнаружили себя в системе с grep, вы можете найти это «лучший» способ, потому что Ruby может быть медленным, когда дело доходит до файловых операций.

+2

, он не указал его os yet = \ –

+13

Я думаю, что лучше всего предположим, что он здравомыслящий. –

+0

Довольно забавно, что это был файл rakefile, который я создавал, когда я придумал этот вопрос, поэтому я могу даже перераспределить это на sh «grep meow cat_sounds.txt» :-) – ChrisInCambo

0

Это читает файл только первого появления «строка» и обрабатывает его построчно - не читает весь файл сразу.

def file_contains_regexp?(filename,regexp) 
    File.foreach(filename) do |line| 
    return true if line =~ regexp 
    end 
    return false 
end 
Смежные вопросы