2011-12-30 5 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

이 시도 :

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)과는 같은 GZIP 판독기를 통해 간단하게 루프 할 수 있어야한다 한 번에 오류를 캡처하는 방법은 아닙니다. 즉에만 고유 한 값이 저장되어, 배열과 같은

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 

설정 행위를하지만, 해시를 사용하여 구축되고, 그래서 해시처럼 그러나 우리는 키에만 관심이있어 : Tigraine의 대답 @에 구축. 중복을 추가하려고하면 고유 한 값만 남겨서 버려 질 것입니다. 당신은 배열을 사용할 수 있고, 이후에는 uniq을 사용합니다. 그러나 Set은 그것을 관리 할 것입니다.

>> require 'set' 
=> true 
>> errors = Set.new 
=> #<Set: {}> 
>> errors << 'a' 
=> #<Set: {"a"}> 
>> errors << 'b' 
=> #<Set: {"a", "b"}> 
>> errors << 'a' 
=> #<Set: {"a", "b"}> 
관련 문제