Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 从url导入CSV错误号::enametolong:文件名太长_Ruby On Rails_Csv_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 从url导入CSV错误号::enametolong:文件名太长

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-

我正试图从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-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文件的内存问题