ここでこの質問を見つけましたが、出力に問題があり、ifステートメントでそれを処理する方法があります。これは私が持っているものですが、Wordモニターがファイルに存在しない場合でも常に真実であると言っています
if File.readlines("testfile.txt").grep(/monitor/)
do something
end
== "nil"のようなものでしょうか? Rubyが初めてであり、出力がどうなるかわからない。
Enumerable#grep はブール値を返しません。それは配列を返します(そうでなければブロックを渡さずにどのようにマッチにアクセスできますか?)。
一致するものが見つからない場合、空の配列を返し、[]
はtrue
と評価されます。 if
ステートメントで配列のサイズを確認する必要があります。つまり:
if File.readlines("testfile.txt").grep(/monitor/).size > 0
# do something
end
ドキュメントは、このような質問に対する最初のリソースになります。
私は使うだろう:
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み」するのは良い習慣ではないのはなぜですか 」を参照してください。
Grepは、見つかったすべての「モニター」の配列を提供します。しかし、配列は必要ありません。ブール値が必要です。このファイルに「モニター」文字列はありますか?これは、必要なだけファイルを読み込みます:
if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
p 'do something'
end
readlinesはファイル全体を読み取り、linesは行ごとにそれを行う列挙子を返します。
誰かがその文字列が発生するファイルの最後の行を表示する解決策を探しているなら
File.readlines('dir/testfile.txt').select{|l| l.match /monitor/}.last
例
ファイル:
monitor 1
monitor 2
something else
あなたは得るでしょう
monitor 2