Ruby on rails 从url导入CSV错误号::enametolong:文件名太长
我正试图从url导入CSV文件,但得到的Ruby on rails 从url导入CSV错误号::enametolong:文件名太长,ruby-on-rails,csv,ruby-on-rails-4,Ruby On Rails,Csv,Ruby On Rails 4,我正试图从url导入CSV文件,但得到的Errno::enametolong:文件名太长。我按如下方式处理该文件: require 'open-uri' url = "http://de65.grepolis.com/data/csv.txt" url_data = open(url).read() SmarterCSV.process(url_data, { ... }) 我缺少什么?您必须传递一个应该在服务器上的文件名。现在您正在传递所有数据。做这样的事 require 'open-
Errno::enametolong:文件名太长
。我按如下方式处理该文件:
require 'open-uri'
url = "http://de65.grepolis.com/data/csv.txt"
url_data = open(url).read()
SmarterCSV.process(url_data, {
...
})
我缺少什么?您必须传递一个应该在服务器上的文件名。现在您正在传递所有数据。做这样的事
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',{ })
我在使用标准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
希望这对你有帮助
# 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
#模型/关注点/import.rb
需要“打开uri”
需要“导入错误”
模块导入
扩展ActiveSupport::关注点
类方法做什么
def导入_远程(url)
csv=csv.parse(打开(url),标题:true)
开始
ActiveRecord::Base.transaction do
计数器=0
csv.do每行|
行\u散列=行到\u散列
开始
instance=self.name.constantize.create!(行\u散列)
救援=>e
提出ImportError.new(“#{e.message}.at行:#{row_hash}”)
结束
如果instance.persistend,计数器+=1?
结束
结束
救援=>e
返回电子邮件
结束
放置“导入的#{counter}记录”
结束
结束
结束
#lib/tasks/import.rake
名称空间:远程导入do
描述“从CSV导入公司”
任务:您的_模型,[:url]do | t,args|
YourModel.import\u remote(args.url)
结束
结束
#lib/import_error.rb
类导入错误<标准错误
结束
#models/your_model.rb
类YourModel
要点:你能和我一起聊聊吗?->对的SmarterCSV需要本地文件名或文件句柄。此解决方案将解决大型csv文件的内存问题