如何逐行读取gzip文件?

我有一个gzip文件,目前我这样读了:

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

我认为这会将文件转换为字符串,但我想逐行阅读。

我想要完成的是该文件有一些垃圾的警告消息,我想grep这些警告消息,然后将它们写入另一个文件。 但是,一些警告信息会被重复,所以我必须确保我只对它们进行一次grep。 因此逐行阅读会对我有所帮助。

您应该能够像使用常规流一样简单地遍历gzip阅读器( 根据文档 )

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

试试这个:

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

其他答案显示了如何逐行读取文件,而不是如何仅捕获错误一次。 建立在@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,但是使用Hash构建,所以它就像一个哈希,但我们只关心键,即只存储唯一值。 如果您尝试添加重复项,它们将被丢弃,只留下唯一值。 你可以使用一个数组,然后使用uniq ,但是Set会为你uniq管理它。

 >> require 'set' => true >> errors = Set.new => # >> errors << 'a' => # >> errors << 'b' => # >> errors << 'a' => #