Каков наилучший способ поиска строки в файле? - PullRequest
40 голосов
/ 11 марта 2009

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

Ответы [ 5 ]

44 голосов
/ 12 марта 2009
File.open(filename).grep(/string/)

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

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

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

File.foreach(filename) do |file|
  file.grep(/string/)
end
10 голосов
/ 11 марта 2009

grep для foo ИЛИ бара ИЛИ базы, украденной из ruby1line.txt .

$  ruby -pe 'next unless $_ =~ /(foo|bar|baz)/' < file.txt
5 голосов
/ 11 марта 2009

Если ваша ОС имеет пакет grep, вы можете использовать системный вызов:

system("grep meow cat_sounds.txt")

Это вернет true, если grep вернет что-либо, false если нет.

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

3 голосов
/ 11 марта 2009

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

f = File.new("file.txt")
text = f.read
if text =~ /string/ then
#relevant code
end
0 голосов
/ 12 марта 2016

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

def file_contains_regexp?(filename,regexp)
  File.foreach(filename) do |line|
    return true if line =~ regexp
  end
  return false
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...