web-dev-qa-db-ja.com

ファイルに文字列が含まれているかどうかを確認します

ここでこの質問を見つけましたが、出力に問題があり、ifステートメントでそれを処理する方法があります。これは私が持っているものですが、Wordモニターがファイルに存在しない場合でも常に真実であると言っています

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

== "nil"のようなものでしょうか? Rubyが初めてであり、出力がどうなるかわからない。

35
Danny

Enumerable#grep はブール値を返しません。それは配列を返します(そうでなければブロックを渡さずにどのようにマッチにアクセスできますか?)。

一致するものが見つからない場合、空の配列を返し、[]trueと評価されます。 ifステートメントで配列のサイズを確認する必要があります。つまり:

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

ドキュメントは、このような質問に対する最初のリソースになります。

32
Ed S.

私は使うだろう:

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'] }

スケーラビリティの問題の詳細については、「 ファイルを「丸sみ」するのは良い習慣ではないのはなぜですか 」を参照してください。

59
the Tin Man

Grepは、見つかったすべての「モニター」の配列を提供します。しかし、配列は必要ありません。ブール値が必要です。このファイルに「モニター」文字列はありますか?これは、必要なだけファイルを読み込みます:

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

readlinesはファイル全体を読み取り、linesは行ごとにそれを行う列挙子を返します。

6
steenslag

誰かがその文字列が発生するファイルの最後の行を表示する解決策を探しているなら

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

ファイル:

monitor 1
monitor 2
something else

あなたは得るでしょう

monitor 2
0
equivalent8