【问题标题】:Import CSV from url Errno::ENAMETOOLONG: file name too long从 url Errno::ENAMETOOLONG 导入 CSV:文件名太长
【发布时间】:2014-05-06 18:24:40
【问题描述】:

我正在尝试从 url 导入 CSV 文件,但我得到了Errno::ENAMETOOLONG: file name too long。我按如下方式处理文件:

require 'open-uri'
url = "http://de65.grepolis.com/data/csv.txt"
url_data = open(url).read()

SmarterCSV.process(url_data, {
  ...
})

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails csv ruby-on-rails-4


    【解决方案1】:

    你必须传递一个应该在服务器上的文件名。现在你正在传递所有数据。做这样的事情

    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',{ })
    

    【讨论】:

    【解决方案2】:

    我在使用标准 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
    

    【讨论】:

      【解决方案3】:

      希望对你有所帮助。

      # 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

      【讨论】:

      • 此解决方案将遇到大 csv 文件的内存问题
      猜你喜欢
      • 2015-07-05
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多