打开包含要在rake任务中使用的csv文件的zip文件

时间:2016-01-15 16:16:52

标签: ruby-on-rails ruby csv

我有一个看起来像这样的rake任务

require 'open-uri'
require 'csv'
namespace :Table do
   task reload: :environment do
       ActiveRecord::Base.connection.execute("TRUNCATE Table RESTART IDENTITY")
       csv_text = open('URL')
       csv = CSV.parse(csv_text, :headers=>true)
       csv.each do |row|
         Table.create(table columns)
       end
   end
end

现在我可以让文件以gzip或zip格式返回。它必须被压缩,但csv是zip文件中唯一的文件。

我有什么想法可以让它在zip文件中打开csv吗?

感谢您的帮助

萨姆

2 个答案:

答案 0 :(得分:3)

Ruby核心包括Zlib支持。如果您有指向gzip压缩文件的网址,则可以使用Zlib::GzipReaderTempfile返回的open进行通知。

gzipped = open('URL')
csv_text = Zlib::GzipReader.new(gzipped).read
csv = CSV.parse(csv_text, :headers=>true)

答案 1 :(得分:0)

我会使用rubyzip gem,将文件读取到临时文件解压缩,拉出你想要的文件并正常打开它作为CSV的本地文件。

require 'open-uri'
require 'csv'
require 'zip'
namespace :Table do
   task reload: :environment do
       ActiveRecord::Base.connection.execute("TRUNCATE Table RESTART IDENTITY")

       t=Tempfile.new("foo.zip")
       url = open("url")
       t.binmode
       t.write stringIo.read
       t.close

       zip_file = Zip::File.open(t.path)
       entry = zip_file.glob('*.csv').first

       csv_text = entry.get_input_stream.read
       csv = CSV.parse(csv_text, :headers=>true)
       csv.each do |row|
         Table.create(table columns)
       end
   end
end