如何在 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 并没有明确说明如何实际使用它。

我有一个类似的任务,并且 ruby​​guides.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,但同样,您可能会从 ruby​​guides.com 页面上的清晰示例中获得更多帮助。我要强调的一件事是,当您告诉.parse 期待标题时,结果表会将第一行数据视为行[0]

您可能会对新的Table 对象可用的.by_col 方法特别感兴趣。这将允许您遍历输入和/或输出中的不同列索引位置,并从一个复制到另一个或向输出添加新值。如果我得到它的工作,我会回来并发布一个例子。

【讨论】:

以上是关于如何在 Ruby 中创建 CSV 文件的某些列的副本,其中一列中有不同的数据?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从带有标题的csv文件中自动在PostgreSQL中创建一个表吗?

如何在 Ruby 中创建文件

如何在 Ruby 中创建 JSON 对象

在php中创建一个CSV文件[关闭]

我如何输入路径并在同一路径中创建所有 csv 文件的 hdf5 文件?

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。