2011-09-12 7 views
1

ファイル内に値が存在するかどうかを確認する方法はありますか? Ruby grep、match and return

if open('file.txt').grep(/value/).length > 0 
    puts "match" 
else 
    puts "no match" 
end 
しかし、私はそれだけが存在するかどうかを知りたいと、それは効率的ではありません。

は現在、私は使用していました。 grep /他の類似ライナーのソリューションを本当に感謝します。

は私の質問定義により

+0

そして、どのように正確には、ファイルを経由せずに値が含まれているかどうかを確認するために計画してください:あなたが正規表現にマッチするすべての行を検索したい場合は、現在の行番号

を保存するグローバル変数、そしてありますファイル全体? – Geo

+0

@Tempos:たとえば、値がファイルの先頭にある場合は、それを見た直後に戻ります。 – w00d

+0

ファイルをどのように配置しても、少なくとも1回はファイル全体を移動する必要があります。 – Geo

答えて

2

あなたはワンライナーを使用して、ライン・バイ・ラインの比較をしたい場合:

matches = open('file.txt') { |f| f.lines.find { |line| line.include?("value") } } 
puts matches ? "yes" : "naaw" 
+0

はうまくいかない?正面に置かれているのは正しいですか? – w00d

+0

putsはそれを壊しているようです(私がifの周りに括弧を指定しなかったので)。 –

0

をダウン投票前に「ALWAYS」に注意してください、任意の式は、ファイル内に存在する場合は、あなたが言うことができる唯一の方法は、ファイルの上に行くと、それを探すことです。最初のインスタンスを探している場合、平均して式が見つかるまでファイルの半分をスキャンします。表現がそこにない場合は、ファイル全体をスキャンしてそれを把握する必要があります。

ファイルを1行ずつスキャンして1行に実装することができます。 IO.foreach

これを頻繁に行うと、ファイルを最初に索引付けすることで検索効率を上げることができます。 Luceneを使って。これはトレードオフです。ファイルをスキャンする必要がありますが、検索の利便性の高いデータ構造でコンテンツを保存するため、一度だけスキャンする必要があります。ただし、あるファイルに非常に頻繁にアクセスしないと、実装、メンテナンス、および余分なストレージのオーバーヘッドにはならないでしょう。

0

はここで、テキストファイルに対してgrepを実行するためにLinuxのコマンドラインから動作しますルビーワンライナーだし、最初は見つかった。

ruby -ne '(puts "first found on line #{$.}"; break) if $_ =~ /regex here/' file.txt 

-nは、ファイル内の各行を取得し、グローバル変数$ _

$に供給する。

ruby -ne 'puts "found on line #{$.}" if $_ =~ /regex here/' file.txt