2016-01-18 4 views
2

Ниже приведен код, который я использую для анализа CVS из приложения, но я хочу проанализировать файл, расположенный в ведро Amazon S3. Он должен работать, когда его оттесняют в Хероку.Как разобрать CSV-файл, расположенный в ведро Amazon S3

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

Вы можете сделать это, как этот

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

CSV.load дал мне * NoMethodError: частный метод 'load', вызываемый для CSV: class *, но это привело меня к ** CSV.new **, который сработал. Благодаря! – Agans

+0

@ Аганы исправили это! –

+0

@MikeSzyndel благодарит хорошее решение. –

1

Вы можете получить файл CSV из S3 так:

require 'csv' 
require 'net/http' 

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

Есть случаи с S3, когда разрешения на S3 Disallow объектов публичный доступ. Встроенные функции 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) 

Per-лайн объяснение с помощью AWS SDK: Line 1. Инициализировать Line 2. Выберите ведро. Строка 3. Выберите объект и получите его как строку. Строка 4. Эффективно CSV.parse ('строка'), но я также добавил параметры и набросился на него на всякий случай, если это поможет вам.

Смежные вопросы