Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何解析AmazonS3存储桶中的CSV文件_Ruby On Rails_Ruby_Csv_Heroku_Amazon S3 - Fatal编程技术网

Ruby on rails 如何解析AmazonS3存储桶中的CSV文件

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.

下面是我用来解析应用程序中的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.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可以处理它。这将比首先转换为字符串更有效。