我有一个看起来像这样的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吗?
感谢您的帮助
萨姆
答案 0 :(得分:3)
Ruby核心包括Zlib支持。如果您有指向gzip压缩文件的网址,则可以使用Zlib::GzipReader对Tempfile
返回的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