即时读取压缩的csv文件

Isr*_*ael 6 ruby csv bzip2

我已经编写了一些csv文件并使用以下代码对其进行压缩:

arr = (0...2**16).to_a
File.open('file.bz2', 'wb') do |f|
  writer = Bzip2::Writer.new f
  CSV(writer) do |csv|
    (2**16).times { csv << arr }
  end
  writer.close
end
Run Code Online (Sandbox Code Playgroud)

我想读这个csv bzip2ed文件(用bzip2压缩的csv文件).这些未压缩的文件看起来像:

1,2
4,12
5,2
8,7
1,3
...
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这段代码:

Bzip2::Reader.open(filename) do |bzip2|
  CSV.foreach(bzip2) do |row|
    puts row.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当它被执行时,它会抛出:

/Users/foo/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/csv.rb:1256:in `initialize': no implicit conversion of Bzip2::Reader into String (TypeError)
from /Users/foo/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/csv.rb:1256:in `open'
from /Users/foo/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/csv.rb:1256:in `open'
from /Users/foo/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/csv.rb:1121:in `foreach'
from worm_pathfinder_solver.rb:79:in `block in <main>'
from worm_pathfinder_solver.rb:77:in `open'
from worm_pathfinder_solver.rb:77:in `<main>'
Run Code Online (Sandbox Code Playgroud)

问题:

怎么了?我应该怎么做?

小智 11

CSV.foreach假设您正在传递文件路径以进行打开.如果要将流传递给CSV,则需要更明确并使用CSV.new.此代码将处理一个gzip压缩文件:

Zlib::GzipReader.open(filename) do |gzip|
  csv = CSV.new(gzip)
  csv.each do |row|
    puts row.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)


Dav*_*ric 2

根据简短的文档,您可能需要发送readbzip2 对象上的方法(未测试):

Bzip2::Reader.open(filename) do |bzip2|
  CSV.foreach(bzip2.read) do |row|
    #               ^^^^
    puts row.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)