如何解析位于Amazon S3存储桶中的CSV文件

时间:2016-01-18 13:54:25

标签: ruby-on-rails ruby csv heroku amazon-s3

以下是我用来从应用程序中解析CSV的代码,但我想解析位于Amazon S3存储桶中的文件。它也需要在推送到Heroku时工作​​。

namespace :csvimport do
  desc "Import CSV Data to Inventory."
  task :wiwt => :environment do
    require 'csv'

    csv_file_path = Rails.root.join('public', 'wiwt.csv.txt')

    CSV.foreach(csv_file_path) do |row|
      p = Wiwt.create!({
        :user_id => row[0],
        :date_worn => row[1],
        :inventory_id => row[2],
      })
    end
  end
end

4 个答案:

答案 0 :(得分:7)

你可以这样做

CSV.new(open(path_to_s3)).each do |row|
  ...
end

答案 1 :(得分:5)

有S3的情况,当S3对象的权限不允许公共访问时。内置的Ruby函数确实假设路径可公开访问,并且不考虑AWS S3特异性。

s3 = Aws::S3::Resource.new
bucket = s3.bucket("bucket_name_here")
str = bucket.object("file_path_here").get.body.string
content = CSV.parse(str, col_sep: "\t", headers: true).map(&:to_h)

使用AWS SDK的每行说明: 第1行。初始化 第2行。选择一个桶。 第3行。选择一个对象并将其作为String。 第4行。有效地CSV.parse('字符串'),但我还添加了一个选项并映射它以防万一它可以帮助你。

答案 2 :(得分:1)

您可以从S3获取csv文件:

require 'csv'
require 'net/http'

CSV.parse(Net::HTTP.get(s3_file_url), headers: true).each do |row|
# code for processing row here
end

答案 3 :(得分:1)

这对我有用

  open(s3_file_path) do |file|
    CSV.foreach(file, {headers: true, header_converters: :symbol}) do |row|
      Model.create(row.to_hash)
    end
  end