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

Aga*_*ans 6 ruby csv ruby-on-rails heroku amazon-s3

下面是我用来从应用程序中解析CVS的代码,但我想解析位于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
Run Code Online (Sandbox Code Playgroud)

Mik*_*del 8

你可以这样做

CSV.new(open(path_to_s3)).each do |row|
  ...
end
Run Code Online (Sandbox Code Playgroud)


小智 6

有S3的情况,当S3 Object的权限不允许公共访问时.内置的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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的答案; 应该更多地投资.我唯一的评论是,不是做.get.body.string,而是做.get.body,它返回StringIO,CSV.parse可以处理.这比首先转换为字符串更有效. (2认同)