更智能的CSV和上传的CSV文件

4

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

有什么想法吗?


你使用的是哪个版本的 smarter_csv? 尽量使用最新版本! - Tilo
3个回答

6

提议的答案不起作用。

然而,如果你这样做:

    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。


2
使用 tempfile 实例变量是正确的。谢谢! - Rian Rainey

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'。 - Jackson
你确定上传文件中的数据是有效的CSV格式吗?也许可以尝试使用另一种CSV.parse方法。 - Troy
smarter_csv是CSV的替代品,而不是反过来。 - Tilo

1

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

您需要使用

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接