以下是我用来从应用程序中解析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
答案 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