2011-12-30 37 views
8

私はgzipファイルを持っており、現在、私はこのようにそれを読む:行ごとにgzipファイルを読み込むにはどうすればよいですか?

infile = open("file.log.gz") 
gz = Zlib::GzipReader.new(infile) 
output = gz.read 
puts result 

私は、これは、文字列にファイルを変換と思いますが、私は行ずつそれを読みたいと思います。

私が達成したいのは、ファイルにいくつかのガーベジを含む警告メッセージがあることです。これらの警告メッセージをgrepして別のファイルに書きたいと思っています。しかし、いくつかの警告メッセージが繰り返されるので、私はそれらを一度しかgrepしないようにしなければなりません。したがって、行ごとの読みは私を助けるだろう。

答えて

17

infile = open("file.log.gz") 
gz = Zlib::GzipReader.new(infile) 
gz.each_line do |line| 
    puts line 
end 
+0

読み取りが完了した後、自動的にファイルを閉じますか? – Rohit

+3

はい、いいえ - GzipReaderがファイルに対して直接操作する場合、そのファイルを閉じることができます。しかしこの場合、私は 'open'メソッドがファイルを開くと仮定したので、' inline' IOストリームを閉じる必要があります。 – Tigraine

+2

うわー!! 4年以上経っていても、回答にはコメントが返ってくる。 これは献身です! もう一度ありがとうございます。 – Rohit

1

この試してみてください:あなたはあなたのようなgzipでリーダーの上に単純にループすることができるはず

infile = open("file.log.gz") 
gz = Zlib::GzipReader.new(infile) 
while output = gz.gets 
    puts output 
end 
+1

@Tigraineのように 'while'を使っているのですが、' each_line'はRubyでもっと慣れています。 –

+2

私は知っています。私は自分の答えを削除することを考えていましたが、それを残すことを決めました。 –

+2

それは良い理由です。私は定期的に何かを達成する別の方法を示しています。それがRubyの美しさです。他の言語で学んだことに近いスタイルで書くことができ、プログラマーとしてのアクセシビリティと移植性が向上します。これは開発者にとって透明なMatzの目標に沿ったものでした。 –

1

他の回答には、ファイルの行を読み取る方法を示す正規のストリーム(according to the docs)を行います一度だけエラーを捕捉する方法ではない。 Tigraineの答え@上の構築:

require 'set' 

infile = open("file.log.gz") 
gz = Zlib::GzipReader.new(infile) 

errors = Set.new 
# or ... 
# errors = [].to_set 

gz.each_line do |line| 
    errors << line if (line[/^Error:/]) 
    # or ... 
    # errors << line if (line['Error:']) 
end 

puts errors 

設定は、Arrayのように動作しますが、ハッシュを使用して構築され、それはハッシュのようだが、我々は唯一のキーに関係しているので、すなわち、唯一のユニークな値が格納されています。重複を追加しようとすると、それらは破棄され、一意の値だけが残されます。あなたは配列を使用することができ、その後はuniqを使用しますが、Setはそれをあなたのために管理します。

関連する問題