Проверьте, содержит ли файл строку - PullRequest
35 голосов
/ 07 декабря 2011

Итак, я нашел этот вопрос здесь, но у меня возникла проблема с выводом и как его обработать с помощью оператора if. Это то, что у меня есть, но он всегда говорит, что это правда, даже если в файле не существует слово monitor

if File.readlines("testfile.txt").grep(/monitor/)
  do something
end

Должно ли это быть что-то вроде == "nil"? Я совсем новичок в ruby ​​и не уверен в том, какие будут результаты.

Ответы [ 4 ]

59 голосов
/ 07 декабря 2011

Я бы использовал:

if File.readlines("testfile.txt").grep(/monitor/).any?

или

if File.readlines("testfile.txt").any?{ |l| l['monitor'] }

При использовании readlines возникают проблемы с масштабируемостью, поскольку он считывает весь файл в массив. Вместо этого, использование foreach позволит выполнить то же самое без проблемы масштабируемости:

if File.foreach("testfile.txt").grep(/monitor/).any?

или

if File.foreach("testfile.txt").any?{ |l| l['monitor'] }

См. " Почему" слопать "файл не рекомендуется? " для получения дополнительной информации о проблемах масштабируемости.

32 голосов
/ 07 декабря 2011

Enumerable # grep не возвращает логическое значение; он возвращает массив (как бы вы имели доступ к совпадениям, не передавая блок в противном случае?).

Если совпадений не найдено, возвращается пустой массив, а [] оценивается как true. Вам нужно проверить размер массива в операторе if, т.е.:

if File.readlines("testfile.txt").grep(/monitor/).size > 0
  # do something
end

Документация должна быть вашим первым ресурсом для подобных вопросов.

6 голосов
/ 07 декабря 2011

Grep даст вам массив всех найденных мониторов.Но вам не нужен массив, вы хотите логическое значение: есть ли в этом файле строка 'monitor'?Этот файл читает как можно меньше файла:

if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
  p 'do something'
end

readlines читает весь файл, lines возвращает перечислитель, который делает это построчно.

0 голосов
/ 22 мая 2013

, если кто-то ищет решение для отображения последней строки файла, в котором эта строка встречается, просто выполните

File.readlines('dir/testfile.txt').select{|l| l.match /monitor/}.last 

пример

file:

monitor 1
monitor 2
something else

вы получите

monitor 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...