首页 > 解决方案 > 从 Ruby 中的 csv 字段读取数组的正确方法是什么?

问题描述

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

CSV 文件 当我将它保存到文件时,它看起来像这样:"[""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


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

标签: rubycsvoop

解决方案


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

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

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

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

更安全的方法是编写您自己的与 String 表示之间的转换函数,或者使用 YAML 或 JSON 等格式将 Array 表示为 String,而不是使用to_s.


推荐阅读