【问题标题】:What's the correct way to read an array from a csv field in Ruby?从 Ruby 中的 csv 字段读取数组的正确方法是什么?
【发布时间】:2021-08-25 23:23:24
【问题描述】:

我正在尝试将一些类对象保存到 csv 文件中,一切正常。我可以保存并从 csv 文件中读取,只有一个“小”问题,属性是 ArrayStrings

当我将它保存到文件时,它看起来像这样:"[""Dan Brown""]"

 CSV.open('documents.csv', "w") do |csv|
      csv << %w[ISBN Titre Auteurs Type Disponibilité]
      @docs.each { |doc|
        csv << [doc.isbn, doc.titre, doc.auteurs, doc.type, doc.empruntable ? "Disponible" : "Emprunté"]
      }
    end

当我尝试从文件中提取数据时,我最终得到如下内容:["[\"Dan Brown\"]"]


table = CSV.parse(File.read("documents.csv"), headers: true)
    table.each do |row|
      doc = Document.new(row['Titre'], row['ISBN'], row['Type'])
      doc.auteurs << row['Auteurs'] #This the array where there is a 'problem'
      if row['Disponibilité'] == "Disponible"
        doc.empruntable = true
      else
        doc.empruntable = false
      end
      @docs.push(doc) #this an array where I save my objects
    end


我尝试了很多方法来解决这个问题,但没有任何运气。如果您能帮我找到解决方案,我将不胜感激。

【问题讨论】:

  • 我的猜测是其中两个反斜杠(内部的)不是真正的反斜杠,而只是双引号中双引号的表示。尝试手动验证字符串的大小以确认这一点。

标签: ruby csv oop


【解决方案1】:

由于 CSV 文件本质上在其字段中仅包含字符串,而不包含数组或其他数据类型,因此 CSV 类将应用对象的 to_s 方法将它们转换为字符串,然后再将它们放入CSV。

当您稍后读回它们时,您会得到这个 - 曾经是您的数组的字符串表示形式。唯一知道 'Auteurs' 应该以字符串数组结尾的是应用程序,即你。

因此在读取 CSV 时,在提取 autheurs 字符串后,您需要手动将其转换回数组,因为没有自动“逆向方法”来反转 to_s

一种廉价但危险的方法是使用eval,它确实会重建您的数组。但是,您需要确保没有人有机会手动处理 CSV 数据,因为eval 允许潜入任意代码。

更安全的方法是编写您自己的与字符串表示的转换函数,或者使用 YAML 或 JSON 等格式将数组表示为字符串,而不是使用 to_s

【讨论】:

  • 我也是这么想的,但是正如你所说,我没有找到将String表示转回Array的方法,我用eval尝试了你所说的,看来它正在工作,谢谢。我确实遇到了危险,但是 csv 总是从我的类对象生成的,所以我只是在取回信息。
  • @Isumairu :在我的项目中,我们有类似的问题,但在我们的例子中,字符串保证 not 包含某个字符(在我们的例子中,逗号),所以我只需 join 用逗号分隔数组的各个部分,然后使用 split 将它们分开。如果这对您不起作用,那么有什么反对使用 JSON 的呢?无论如何,它随 Ruby 一起免费提供。
  • 我的意思是,如果我要改变它,我将不得不改变许多其他与之相关的东西,而且我在这里有点赶时间,所以我不得不找到像类型转换这样的东西来修复它。无论如何感谢您的发票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多