如何在Ruby中创建CSV文件的某些列的副本,并在一列中包含不同的数据?


84

我有一个名为“ A.csv”的CSV文件。我需要使用来自“ A.csv”的数据生成一个名为“ B.csv”的新CSV文件。

我将使用“ A.csv”中列的子集,并且必须将一列的值更新为“ B.csv”中的新值。最终,我将使用B.csv中的数据对数据库进行验证。

  1. 如何创建新的CSV文件?
  2. 如何将所需列的数据从A.csv复制到“ B.csv”?
  3. 如何为特定列附加值?

我是Ruby的新手,但是我可以读取CSV来获取数组或哈希。


2
缺少基本信息,例如向我们展示了您为解决问题而付出的努力。此信息在CSV文档中。阅读“如何提问”和“最小可复制示例”。
Tin Man

Answers:


191

正如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

与上面几乎相同的公式只是使用“ a +”模式,而不是使用“ wb”模式。有关这些的更多信息,请参见以下堆栈溢出答案:什么是Ruby File.open模式和选项?

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


如果我想不写就打开怎么办?只是不使用块?
多纳托

感谢您复制并粘贴代码!-懒得写。
DominikAngerer

这涵盖了创建新的CSV的内容,然后介绍了有关添加和读取整行的信息,而不是解决复制可用列的子集以及更改或添加其值的请求。我有与OP相同的项目,文档或此答案也无济于事,因此希望我能在找到答案后再回来提供更具体的答案。
泰勒·詹姆斯·扬


0

您可能想要使用CSV::parseRuby帮助Ruby将CSV理解为它本身的数据表,并允许通过标头轻松访问值。

不幸的是,有关该CSV::parse方法的可用文档并未明确说明如何实际使用此方法。

我有一个类似的任务,并且在rubyguides.com上如何使用Ruby读取和解析CSV文件的帮助比CSV类文档或从此处指向它的答案给了更多的帮助。

我建议您完整阅读该页面。关键部分是CSV::Table使用以下命令将给定的CSV转换为对象:

table = CSV.parse(File.read("cats.csv"), headers: true)

现在有关于CSV::Tableclass文档,但是rubyguides.com页面上的清晰示例可能再次为您提供帮助。我要强调的一件事是,当您告诉.parse您期望标题时,结果表会将数据的第一行视为row [0]

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.