使用Bzip2即时压缩到文件?

时间:2014-04-23 20:44:19

标签: ruby csv bzip2

有一个程序可以生成巨大的CSV文件。例如:

arr = (0..10).to_a
CSV.open("foo.csv", "wb") do |csv|
  (2**16).times { csv << arr }
end

它会生成一个大文件,因此我希望在运行中 ,而不是输出非压缩的CSV文件({{ 1}}),输出一个bzip压缩的CSV文件(foo.csv)。

我有一个例子来自&#34; ruby​​-bzip2&#34;宝石:

foo.csv.bzip

我不确定如何从CSV编写Bzip2写入。

2 个答案:

答案 0 :(得分:3)

您还可以使用IO或类似于IO的内容构建CSV对象,例如Bzip2::Writer

例如

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

答案 1 :(得分:3)

将CSV数据写入 stdout 可能会更灵活:

# csv.rb
require 'csv'
$stdout.sync = true

arr = (0..10).to_a
(2**16).times do
  puts arr.to_csv
end

...并将输出传递给bzip2

$ ruby csv.rb | bzip2 > foo.csv.bz2