【问题标题】:Reading a CSV File in Rails 5在 Rails 5 中读取 CSV 文件
【发布时间】:2018-04-07 11:53:29
【问题描述】:

我正在尝试读取表单上传的 .csv 文件。我的部分答案来自几个答案:In Ruby, how to read data column wise from a CSV file?how to read a User uploaded file, without saving it to the databaseRails - Can't import data from CSV file。但到目前为止,没有任何效果。

这是我的代码:

def upload_file
  file = Tempfile.new(params[:search_file])
  csv_text = File.read(file)
  csv = CSV.parse(csv_text, :headers => true)
  csv.each do |row|
    puts row
  end
  render json: {success: true}
end

我确定该文件不为零。它包含 4 列和 2 行的简单文本。但是,我上面的file 值是一个空数组,而csv_text 值是一个空字符串。我非常确定该文件包含值。

我也试过params[:search_field].read,每次都会抛出一个错误,说“未定义的方法'读取'”。

我怎样才能简单地从用户上传的文件中读取这些值?我在 Rails 5.1.6 和 ruby​​ 2.3 上。

编辑: 我已经尝试了以下一些解决方案。但是,问题是它没有写入文件的 contents,当我调用 file.write 时,它只是将文件名(如 myFileNameHere.csv)写入字符串到临时文件。在下面的代码中,“ok testing now”永远不会打印到终端。这是我现在的代码:

file = Tempfile.new(['hello', '.csv'])
file.write(params[:search_file])
file.rewind
csv_text = file.read
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
  puts "ok testing row"
  puts row
end
file.close
file.unlink    # deletes the temp file

【问题讨论】:

  • 我打赌你的 undefined method 'read' 错误信息比你在这里写的要多。请指出整个错误消息,而不仅仅是其中的一部分。我怀疑它说的是没有为nil 对象或类似的东西定义“读取”。检查params[:search_file] 的值。可能是nil 或不存在的文件。
  • 什么是params[:search_field]
  • 嗨@joey,你能告诉我表单中的输入字段吗?

标签: ruby-on-rails ruby


【解决方案1】:

您正在从一个空的临时文件中读取。当您输入 params[:search_file] 时,该值将成为新 Tempfile 文件名的一部分(如“/tmp/#{params[:search_file]}.24722.0”)。

因此,当您执行 File.read(file) 时,它会尝试读取一个临时文件,该文件的文件名中包含 params[:search_file] 值,但其中的表单中没有其他值。

您应该跳过 Tempfile 部分并使用 File.read(params[:search_file]) 加载 params[:search_file] 或使用 params[:search_file] 内容填充新的 Tempfile 对象。 (我会推荐第一个)。

【讨论】:

    【解决方案2】:

    Tempfile.new('something') 总是返回一个空的临时文件,其基本名称为“something”。

    首先您创建临时文件(使用您想要的文件名),然后您可以从params[:search_file] 写入内容,倒带并读取它。

    来源:Class: Tempfile (Ruby 1.9.3)

    【讨论】:

    • 我已经尝试过了,但问题是通过 params[:search_file] 写入内容只是将其作为字符串写入文件。我用新代码编辑了上面的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2012-09-28
    • 2016-04-09
    • 2023-03-22
    • 2011-07-24
    相关资源
    最近更新 更多