如何在 Ruby 中创建 CSV 文件的某些列的副本,其中一列中有不同的数据?
Posted
技术标签:
【中文标题】如何在 Ruby 中创建 CSV 文件的某些列的副本,其中一列中有不同的数据?【英文标题】:How do I create a copy of some columns of a CSV file in Ruby with different data in one column? 【发布时间】:2012-09-24 23:50:55 【问题描述】:我有一个名为“A.csv”的 CSV 文件。我需要使用“A.csv”中的数据生成一个名为“B.csv”的新 CSV 文件。
我将使用“A.csv”中的一部分列,并且必须将一列的值更新为“B.csv”中的新值。最终,我将使用 B.csv 中的这些数据来验证数据库。
-
如何创建新的 CSV 文件?
如何将所需列的数据从 A.csv 复制到“B.csv”?
如何为特定列附加值?
我是 Ruby 新手,但我能够读取 CSV 来获取数组或哈希。
【问题讨论】:
这缺少基本信息,例如向我们展示您为解决问题所做的努力。此信息位于 CSV 文档中。阅读“How to Ask”和“minimal reproducible example”。 Output array to CSV in Ruby的可能重复 【参考方案1】:你看过 Ruby 的 CSV 类吗?看起来还挺全面的。在这里查看: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
【讨论】:
感谢您的链接。我会提到它。我可以通过 ruby 编辑 csv 文件吗?我的意思是我可以更新 csv 中的列值吗?稍后仅获取所需列的哈希值?【参考方案2】:正如 mikeb 指出的那样,有文档 - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - 或者您可以按照以下示例进行操作(所有示例都经过测试并且可以正常工作):
创建一个新文件:
在这个文件中,我们将有两行,一个标题行和一个数据行,非常简单的 CSV:
require "csv"
CSV.open("file.csv", "wb") do |csv|
csv << ["animal", "count", "price"]
csv << ["fox", "1", "$90.00"]
end
结果,一个名为“file.csv”的文件,内容如下:
animal,count,price
fox,1,$90.00
如何将数据附加到 CSV
几乎与上面的公式相同,只是我们不使用“wb”模式,而是使用“a+”模式。有关这些的更多信息,请参阅此堆栈溢出答案:What are the Ruby File.open modes and options?
CSV.open("file.csv", "a+") do |csv|
csv << ["cow", "3","2500"]
end
现在,当我们打开 file.csv 时,我们有:
animal,count,price
fox,1,$90.00
cow,3,2500
从我们的 CSV 文件中读取
现在您知道如何复制和写入文件、读取 CSV 并因此获取数据以进行您刚刚执行的操作:
CSV.foreach("file.csv") do |row|
puts row #first row would be ["animal", "count", "price"] - etc.
end
当然,这就像您可以使用此 gem 从 CSV 中提取信息的一百种不同方式中的一种。欲了解更多信息,我建议您在了解了入门知识后访问文档:http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
【讨论】:
如果我想直接打开而不写怎么办?只是不使用块? 感谢可复制和粘贴的代码! - 懒得写了。 这涵盖了创建一个新的 CSV,但随后介绍了有关添加和读取整行的信息,而不是解决复制可用列的子集并更改或添加其值的请求。我有与 OP 相同的项目,并且没有得到文档或这个答案的帮助,所以希望我能在弄清楚后回到这里提供更具体的答案。【参考方案3】:您可能希望使用CSV::parse
来帮助Ruby 将您的CSV 理解为数据表,并通过标题轻松访问值。
不幸的是,可用的documentation on the CSV::parse
method 并没有明确说明如何实际使用它。
我有一个类似的任务,并且 rubyguides.com 上的 How to Read & Parse CSV Files With Ruby 对我的帮助要多于 CSV 类文档或从此处指向它的答案。
我建议您完整阅读该页面。关键部分是将给定的 CSV 转换为 CSV::Table
对象,使用:
table = CSV.parse(File.read("cats.csv"), headers: true)
现在有documentation on the CSV::Table
class,但同样,您可能会从 rubyguides.com 页面上的清晰示例中获得更多帮助。我要强调的一件事是,当您告诉.parse
期待标题时,结果表会将第一行数据视为行[0]
。
您可能会对新的Table
对象可用的.by_col
方法特别感兴趣。这将允许您遍历输入和/或输出中的不同列索引位置,并从一个复制到另一个或向输出添加新值。如果我得到它的工作,我会回来并发布一个例子。
【讨论】:
以上是关于如何在 Ruby 中创建 CSV 文件的某些列的副本,其中一列中有不同的数据?的主要内容,如果未能解决你的问题,请参考以下文章
我可以从带有标题的csv文件中自动在PostgreSQL中创建一个表吗?