如何逐行读取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' => #