Ruby on rails 如何解析AmazonS3存储桶中的CSV文件
下面是我用来解析应用程序中的CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推到Heroku时,它也需要工作Ruby on rails 如何解析AmazonS3存储桶中的CSV文件,ruby-on-rails,ruby,csv,heroku,amazon-s3,Ruby On Rails,Ruby,Csv,Heroku,Amazon S3,下面是我用来解析应用程序中的CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推到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.
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
你可以这样做
CSV.new(open(path_to_s3)).each do |row|
...
end
您可以通过以下方式从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
在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行。选择一个对象并将其作为字符串获取。
第4行。实际上是CSV.parse('the string'),但我还添加了一个选项并映射到它上面,以防它对您有所帮助。这对我来说很有用
open(s3_file_path) do |file|
CSV.foreach(file, {headers: true, header_converters: :symbol}) do |row|
Model.create(row.to_hash)
end
end
CSV.load给了我一个名为NoMethodError:private的方法'load',该方法调用了CSV:class,但它将我引向了CSV.new,它起到了作用。谢谢这是一个很好的答案;应该更多地投票。我唯一的评论是,与其做.get.body.string,不如做.get.body,它返回StringIO,CSV.parse可以处理它。这将比首先转换为字符串更有效。