ruby - 从 Ruby 中的 csv 字段读取数组的正确方法是什么?
问题描述
我正在尝试将一些类对象保存到 csv 文件中,一切正常。我可以保存并从 csv 文件中读取,只有一个“小”问题,属性Array
为Strings
.
当我将它保存到文件时,它看起来像这样:"[""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
我尝试了很多方法来解决这个问题,但没有任何运气。如果您能帮助我找到解决方案,我将不胜感激。
解决方案
由于 CSV 文件本质上在其字段中仅包含字符串,而不包含数组或其他数据类型,因此 CSV 类正在应用to_s
对象的方法将它们转换为字符串,然后再将它们放入 CSV。
当你稍后读回它们时,你就会得到这个 - 曾经是你的数组的字符串表示形式。唯一知道“Auteurs”应该以字符串数组结尾的是应用程序,即您。
因此,在读取 CSV 时,在提取autheurs字符串后,您需要手动将其转换回数组,因为没有自动“逆向方法”来反转to_s
.
一种便宜但危险的方法是使用eval
,它确实会重建你的数组。但是,您需要确保没有人有机会手动处理 CSV 数据,因为它eval
允许潜入任意代码。
更安全的方法是编写您自己的与 String 表示之间的转换函数,或者使用 YAML 或 JSON 等格式将 Array 表示为 String,而不是使用to_s
.
推荐阅读
- python - 具有两个参数的参数化 sql 查询,其中一个是列表的集合
- android - AndroidX Spinner 不显示列表
- react-native - 无法使用 React Native 获取登录/注册表单以与 Firebase 一起使用
- windows - Windows Socket #10060 错误(WSAETIMEDOUT - 尝试连接超时但未建立连接)是否完全是编程错误?
- r - 如何将 %in% 的使用与 OR 运算符结合使用?
- .net - 如何为 Azure WebJob 的每次执行设置区域性?
- swift - UICollectionView 上的可见单元不能在没有参数的情况下调用
- sharepoint-online - SharePoint(本地)列表中的日期字段返回前一天日期而不是 MS-Flow(在线)中的当前日期
- android - 定义 ButterKnife 后,Manifest 合并失败:属性 application@appComponentFactory 错误
- selenium - 无法读取未定义的属性“defaultView”