解析具有延迟作业问题的CSV文件

时间:2011-09-19 10:31:57

标签: ruby-on-rails csv delayed-job

我有一个CSV文件可以用两种方式解析:

  1. 上传文件并实时解析

  2. 上传文件并使用delayed_job

  3. 进行解析

    当我实时解析文件时,没有问题,但是当我用延迟的作业解析文件时,我得到一个CSV :: Table但是有nil字段[nil,nil .....] < / p>

    这就是我在帮助程序中解析文件的方法:

    CSV.parse(file.read, :headers => true, :row_sep =>:auto)
    

    这是我保存csv文件的方法,我创建了延迟的作业: 是的它的CSV,我写了一个错字,但我仍然有问题,我在这样的动作中读取文件:

    def create
    if  params[:dump]
      file = File.new(params[:dump][:file].original_filename, "w")
      File.open(file.path, "w") { |f| f.write(params[:dump][:file].read.force_encoding('UTF-8')) }
    
      @import = Import.create(:created_by => current_user.id, :import_file_path => file.path, :size => 0)
      file.close
      file_to_parse = File.open(@import.import_file_path)
      if params[:dump][:file].size <  10000
        parsed_file = parsed file_to_parse
        if parsed_file &&  parsed_file.count > 0
          @imported_contacts, @imported_organizations = extract_contacts_and_organizations_from parsed_file
    
          validate_and_save @imported_organizations if @imported_organizations.any?
          validate_and_save @imported_contacts      if @imported_contacts.any?
    
          @import.update_attributes(:done => true, :size => (@imported_contacts.size + @imported_organizations.size))
    
          redirect_to org_import_path(current_org, @import)
        else
          redirect_to new_org_import_path(current_org) , :notice => "fichier vide ou introuvable ou ne pas de format cvs/vcf"
        end
      else
        Delayed::Job.enqueue(ImportJob.new(current_org, current_user, @import.id))
        redirect_to org_import_path(current_org, @import)
      end
    else
      redirect_to new_org_import_path(current_org) , :notice => "vous devrez selctionner un fichier"
    end
    
    end
    

1 个答案:

答案 0 :(得分:1)

在您的代码中,@import对象具有:import_file_path变量,该变量指向用户上载的临时文件(file.path)。 由于操作完成后将自动删除此临时文件,因此延迟作业在尝试在后台运行作业时无法找到该文件(操作已完成)。

如何将临时文件复制到某个地方并使用它? 在这种情况下,您需要添加一行代码,以便在延迟作业流程结束时删除复制的文件。

我希望这适用于您的问题。