我已经编写了一些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)
根据简短的文档,您可能需要发送readbzip2 对象上的方法(未测试):
Bzip2::Reader.open(filename) do |bzip2|
CSV.foreach(bzip2.read) do |row|
# ^^^^
puts row.inspect
end
end
Run Code Online (Sandbox Code Playgroud)