Ruby on rails 是否有一种rails方法可以循环浏览上传文件的每一行&引用;每行;是一种IO方法,但它';它不工作了

Ruby on rails 是否有一种rails方法可以循环浏览上传文件的每一行&引用;每行;是一种IO方法,但它';它不工作了,ruby-on-rails,file,upload,loops,params,Ruby On Rails,File,Upload,Loops,Params,我正试图上传一个csv文件,对其进行解析,并为S3输出一个文件,或者直接传递到视图。我使用文件\字段\标签上传csv。我认为file_field_标记传递一个对象,该对象是IO的一个子类,将具有所有ruby IO方法,例如“each_line”。我可以对对象(IO类的方法)调用“read”,但不能调用“each_line”。。。那么我如何迭代文件\字段\标签上传的每一行呢 将我的控制器的创建方法设置为: @csv_file = params[:csv_file] 我的show视图抛出了一个no

我正试图上传一个csv文件,对其进行解析,并为S3输出一个文件,或者直接传递到视图。我使用文件\字段\标签上传csv。我认为file_field_标记传递一个对象,该对象是IO的一个子类,将具有所有ruby IO方法,例如“each_line”。我可以对对象(IO类的方法)调用“read”,但不能调用“each_line”。。。那么我如何迭代文件\字段\标签上传的每一行呢

将我的控制器的创建方法设置为:

@csv_file = params[:csv_file]
我的show视图抛出了一个no“each_line”方法错误:

<% @csv_file.each_line do |line| %>
<%= line %>
<% end %>
然后使用以下命令迭代:

<% @sp_file.each_line do |line| %>
<%= line %>
<% end %>

当您发布一个“file_字段”时,返回给控制器的参数具有一些特殊的魔力

也就是说,在你的情况下,你可以这样做

<%= "The following file was uploaded #{params[:csv_file].original_filename}" %>
<%= "It's content type was #{params[:csv_file].content_type}" %>
<%= "The content of the file is as follows: #{params[:csv_file].read}" %>
所以现在contents是一个包含文件内容的字符串,但是除了它是一个csv文件之外,对该文件一无所知。我们知道csv是用“\r”分隔的(我想,我已经做了很多分析csv的工作,但是我懒得去检查)

所以你可以这样做:

contents = params[:csv_file].read
contents.split("\r").each do |csvline|
  ???
end
编辑2

这是这篇文章的要点

当你把一个file_字段发布到一个控制器上时,最常见的处理上传文件内容的方法就是把它“读”成一个ruby字符串。上传内容的任何附加处理必须在从“read”返回的ruby字符串上完成

在这种特殊情况下,如果上载的文件始终是CSV,则可以假定该CSV并相应地开始解析它。如果您希望使用多种上传格式,则必须处理这些格式,例如:

contents = params[:csv_file].read
case params[:csv_file].content_type
when 'txt/csv'
  contents.split("\r").each do |csvline| 
    ???
  end
when 'application/pdf'
  ???
end

谢谢我仍然不明白为什么我的文件没有继承IO方法。。。我想不出怎么才能找到工作,开始工作吧!我只是用一些我认为有用的代码编辑了我的问题!谢谢根据你的回答,我做了一个内容类型,它限制了txt/csv。。。所以我猜对象是txt/csv,并且只能访问thos方法?。。。但gets是CSV中shift的别名!所以我想我现在明白你问题的真正要点了。答案是:对于上传的文件,您所能做的就是将内容“读取”成字符串。对该字符串的任何附加处理都必须作为Ruby字符串来完成。您希望实际的IO流可以从file_字段返回,但它不能,您只能将其读入字符串。正因为如此,我使用了:@file_out=StringIO.new(@csv_file)将其转换为IO并使用其中一些方法!谢谢这对我有用:@upload_file.open.each_line do|line |。。。结束
<%= "The following file was uploaded #{params[:csv_file].original_filename}" %>
<%= "It's content type was #{params[:csv_file].content_type}" %>
<%= "The content of the file is as follows: #{params[:csv_file].read}" %>
contents = params[:csv_file].read
contents = params[:csv_file].read
contents.split("\r").each do |csvline|
  ???
end
contents = params[:csv_file].read
case params[:csv_file].content_type
when 'txt/csv'
  contents.split("\r").each do |csvline| 
    ???
  end
when 'application/pdf'
  ???
end