我正在尝试上传一个 csv 文件,对其进行解析,然后为 S3 吐出一个文件,或者只是传递给查看。我使用 file_field_tag 上传 csv。我认为 file_field_tag 传递了一个作为 IO 子类的对象,并且将具有所有 ruby IO 方法,例如“each_line”。我可以在对象(IO 类的方法)上调用“读取”,但不能调用“each_line”......那么如何遍历 file_field_tag 上传的每一行?
我的控制器的创建方法为:
@csv_file = params[:csv_file]
我的显示视图引发了 no "each_line" 方法错误:
<% @csv_file.each_line do |line| %>
<%= line %>
<% end %>
然而我可以使用
<%= @csv_file.read(100) %>
我真的很困惑 file_field_tag 上传参数 [] 有什么方法......每个行,都不起作用......我似乎找不到我可以使用的列表。
编辑 我通过以下方式解决了这个问题:
@csv_file = params[:csv_file].read.to_s
然后迭代:
<% @sp_file.each_line do |line| %>
<%= line %>
<% end %>
编辑2 正在上传的文件在不包含逗号的行之后重复了标题(不要问)......所以我找到没有逗号的行并调用.gets(在我的rb脚本中独立于rails)。不幸的是,我收到了一个关于 gets 是我不能调用的私有方法的错误。这可以追溯到我最初的问题。文件不是 IO 的子类,具有 read_lines 和 get 等 IO 方法吗?
@file_out = []
@file_in.each_line do |line|
case line
when /^[^,]+$/
@comp = line.to_s.strip
comp_header = @file_in.gets.strip.split('')
@file_out.push(@comp)
end
end