Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Zlib::GzipReader doesn't work as expected (http://www.velocityreviews.com/forums/t945701-zlib-gzipreader-doesnt-work-as-expected.html)

Thomas Wolf 04-25-2012 08:57 AM

Zlib::GzipReader doesn't work as expected
 
Hi,
given 2 files:
cat 5lines.txt
5 lines
5 lines
5 lines
5 lines
5 lines

cat more5lines.txt
More 5 lines
More 5 lines
More 5 lines
More 5 lines
More 5 lines

These files are "gzip"ed as follows:
gzip < 5lines.txt > foo.gz
gzip < more5lines.txt >> foo.gz

zcat foo.gz:
5 lines
5 lines
5 lines
5 lines
5 lines
More 5 lines
More 5 lines
More 5 lines
More 5 lines
More 5 lines

This ruby code only reads the first 5 lines:
#!/usr/bin/ruby
require "zlib"
filename = ARGV[0]

Zlib::GzipReader.open(filename) {|gz|
print gz.read
}

../test.rb foo.gz
5 lines
5 lines
5 lines
5 lines
5 lines

How do I force Zlib::GzipReader do read the whole file?

ruby versions: 1.8.7 and 1.9.0

Thanks and regards,
Thomas Wolf

Robert Klemme 04-25-2012 07:03 PM

Re: Zlib::GzipReader doesn't work as expected
 
On 04/25/2012 10:57 AM, Thomas Wolf wrote:
> Hi,
> given 2 files:
> cat 5lines.txt
> 5 lines
> 5 lines
> 5 lines
> 5 lines
> 5 lines
>
> cat more5lines.txt
> More 5 lines
> More 5 lines
> More 5 lines
> More 5 lines
> More 5 lines
>
> These files are "gzip"ed as follows:
> gzip < 5lines.txt > foo.gz
> gzip < more5lines.txt >> foo.gz
>
> zcat foo.gz:
> 5 lines
> 5 lines
> 5 lines
> 5 lines
> 5 lines
> More 5 lines
> More 5 lines
> More 5 lines
> More 5 lines
> More 5 lines
>
> This ruby code only reads the first 5 lines:
> #!/usr/bin/ruby
> require "zlib"
> filename = ARGV[0]
>
> Zlib::GzipReader.open(filename) {|gz|
> print gz.read
> }
>
> ./test.rb foo.gz
> 5 lines
> 5 lines
> 5 lines
> 5 lines
> 5 lines
>
> How do I force Zlib::GzipReader do read the whole file?


That's a fairly common limitation of GZip libs (Java's standard lib also
has this limitation, or at least hat last time I checked).

You might get away with wrapping the GzipReader around an open IO object
and wrapping another GzipReader when the first finishes.

Kind regards

robert

Simon Krahnke 04-25-2012 07:53 PM

Re: Zlib::GzipReader doesn't work as expected
 
* Thomas Wolf <thomasw@viacanale.de> (10:57) schrieb:

> These files are "gzip"ed as follows:
> gzip < 5lines.txt > foo.gz
> gzip < more5lines.txt >> foo.gz


So you have two streams of gzipped data in foo.gz.

And the ruby library reads only the first one.

> How do I force Zlib::GzipReader do read the whole file?


I don't know, read the source.

mfg, simon .... l

Simon Krahnke 04-25-2012 07:55 PM

Re: Zlib::GzipReader doesn't work as expected
 
* Robert Klemme <shortcutter@googlemail.com> (21:03) schrieb:

> You might get away with wrapping the GzipReader around an open IO object
> and wrapping another GzipReader when the first finishes.


Like this:

,----[ gz.rb ]
| #!/usr/bin/env ruby
|
| require 'zlib'
| require 'pp'
|
| filename = *ARGV
|
| File.open filename do | f |
| gz1 = Zlib::GzipReader.new(f)
| pp gz1.read
| pp Zlib::GzipReader.new(f).read
| end
`----

Doesn't work.

mfg, simon .... l

Thomas Wolf 04-26-2012 09:54 AM

Re: Zlib::GzipReader doesn't work as expected
 
Am 25.04.2012 21:03, schrieb Robert Klemme:
>> How do I force Zlib::GzipReader do read the whole file?

>
> That's a fairly common limitation of GZip libs (Java's standard lib also
> has this limitation, or at least hat last time I checked).
>
> You might get away with wrapping the GzipReader around an open IO object
> and wrapping another GzipReader when the first finishes.


Thank you.

I found the following thread:
http://www.velocityreviews.com/forum...le-stream.html

and that code works with ruby 1.9.3p0:

require 'stringio'
require 'zlib'

def inflate(filename)
File.open(filename) do |file|
zio = file
loop do
io = Zlib::GzipReader.new zio
puts io.read
unused = io.unused
io.finish
break if unused.nil?
zio.pos -= unused.length
end
end
end

inflate "foo.gz"

Regards,
Thomas

Simon Krahnke 04-26-2012 08:02 PM

Re: Zlib::GzipReader doesn't work as expected
 
* Thomas Wolf <thomasw@viacanale.de> (11:54) schrieb:

> require 'stringio'


This is unneeded.

>require 'zlib'
>
>def inflate(filename)
> File.open(filename) do |file|
> zio = file


You could just use | zio | instead of |file| and get rid of the
assignment.

> loop do
> io = Zlib::GzipReader.new zio
> puts io.read


puts here will put another "\n" at the end of the output, use print
instead.

> unused = io.unused
> io.finish
> break if unused.nil?
> zio.pos -= unused.length
> end
> end
>end
>
>inflate "foo.gz"


Note that as said in the thread this works only for files and other
seekable sources.

So "(seq 1 5 | gzip; seq 6 10 | gzip) | yourscript.rb" won't work.

mfg, simon .... hth


All times are GMT. The time now is 10:25 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57