【问题标题】:Smarter CSV and Uploaded CSV File更智能的 CSV 和上传的 CSV 文件
【发布时间】:2014-02-19 05:11:36
【问题描述】:

对于我的应用程序,我通过file_field_tag 上传文件。如何在 SmarterCSV 中使用该文件?我尝试过类似SmarterCSV.process(@file.tempfile.path) 的方法,即使 CSV 中有数据,它也只会返回一个空数组。

有什么想法吗?

【问题讨论】:

  • 您使用的是哪个版本的 smarter_csv?试试最新版本!

标签: ruby-on-rails ruby csv import


【解决方案1】:

尚不清楚@file 是什么,但如果来自典型的形式并分配如下内容:

@file = params[:resource][:file_tag_name]

然后试试:

SmarterCSV.process(@file.original_filename)

或使用 CSV:

CSV.parse(@file.original_filename)

Rails 在 params 哈希中为文件上传创建的对象是 IO 类的子类的一个实例,因此您需要获取底层文件以将其传递给 SmarterCSV。

有关 Rails 如何处理文件上传的更多信息,请参阅http://guides.rubyonrails.org/form_helpers.html#what-gets-uploaded

【讨论】:

  • @file 是一个 ActionDispatch::Http::UploadedFile 对象。我尝试了上面的 SmartCSV 示例,我收到以下错误,'Errno::ENOENT: No such file or directory'
  • 您确定上传文件中的数据是有效的 CSV 格式吗?也许尝试替代 CSV.parse 方法。
  • smarter_csv 是 CSV 的替代品——而不是相反
【解决方案2】:

建议的答案不起作用。

如果你这样做:

    clients_data = params[:file_categories]
    clients = SmarterCSV.process(clients_data.tempfile, {:chunk_size => 1, :key_mapping => {:ca_id => :id, :ca_desc => :name}})

这很好用。您需要使用 tempfile 而不是 original_filename。

【讨论】:

  • 使用tempfile 实例变量是正确的。谢谢!
【解决方案3】:

SmarterCSV.process(@file.original_filename) 将不起作用,因为它正在寻找存储文件的位置。

你需要使用

SmarterCSV.process(params[:file].tempfile, {:col_sep => "\t", :row_sep => "\n"})

制表符分隔数据“\t”,行由新行“\n”分隔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2020-10-27
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多