我有一个CSV文件可以用两种方式解析:
上传文件并实时解析
上传文件并使用delayed_job
当我实时解析文件时,没有问题,但是当我用延迟的作业解析文件时,我得到一个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
答案 0 :(得分:1)
在您的代码中,@import
对象具有:import_file_path
变量,该变量指向用户上载的临时文件(file.path)。
由于操作完成后将自动删除此临时文件,因此延迟作业在尝试在后台运行作业时无法找到该文件(操作已完成)。
如何将临时文件复制到某个地方并使用它? 在这种情况下,您需要添加一行代码,以便在延迟作业流程结束时删除复制的文件。
我希望这适用于您的问题。