2014-05-06 37 views

回答

6

你必須通過應該在服務器上的文件名。如果你正在傳遞所有數據。做這樣的事情

require 'open-uri' 
url = "http://de65.grepolis.com/data/csv.txt" 
url_data = open(url).read() 
File.open('/tmp/file_name', 'w') { |file| file.write(url_data) } 
SmarterCSV.process('/tmp/file_name',{ }) 
+0

你能和我一起與人聊天? - > http://chat.stackoverflow.com/rooms/52130/import-csv-from-url-rails –

+0

正確! SmarterCSV需要一個本地文件名或文件句柄。 – Tilo

4

我有同樣的問題,使用標準的CSV庫,通過http url拉入CSV文件。我是能夠解決問題,而不需要寫這樣的代碼的臨時服務器文件:

require 'open-uri' 
require 'csv' 
url = "http://de65.grepolis.com/data/csv.txt" 
url_data = open(url).read() 
CSV.parse(url_data, headers: true).each do |row| 
    # per row processing code ... 
end 
+1

這對我來說非常合適!感謝這一點。 – mylescc

+0

'parse'方法在這種情況下效果很好。 –

0

希望這有助於你。

# models/concerns/import.rb 

require 'open-uri' 
require 'import_error' 

module Import 
    extend ActiveSupport::Concern 

    class_methods do 
    def import_remote(url) 
     csv = CSV.parse(open(url), headers: true) 
     begin 
     ActiveRecord::Base.transaction do 
      counter = 0 
      csv.each do |row| 
      row_hash = row.to_hash 
      begin 
       instance = self.name.constantize.create!(row_hash) 
      rescue => e 
       raise ImportError.new("#{e.message}. at row: #{row_hash}") 
      end 
      counter += 1 if instance.persisted? 
      end 
     end 
     rescue => e 
     return puts e.message 
     end 
     puts "Imported #{counter} records" 
    end 
    end 
end 

# lib/tasks/import.rake 

namespace :remote_import do 
    desc "Import companies from CSV" 
    task :your_model, [:url] do |t, args| 
    YourModel.import_remote(args.url) 
    end 
end 

# lib/import_error.rb 

class ImportError < StandardError 
end 

# models/your_model.rb 

class YourModel < ActiveRecord::Base 
    include Import 
end 

要點:https://gist.github.com/victorhazbun87/9ac786961bbf7c235f76