如何在Ruby中创建新的CSV文件?

时间:2012-10-04 00:39:00

标签: ruby csv

我有一个名为“A.csv”的CSV文件。我需要生成一个名为“B.csv”的新CSV文件,其中包含来自“A.csv”的数据。

我将使用“A.csv”中的一个列子集,并且必须将一个列的值更新为“B.csv”中的新值。然后我使用B.csv中的这些数据在数据库中进行验证。

  1. 如何创建新的CSV文件?
  2. 如何将所需列的数据从A.csv复制到“B.csv”?
  3. 如何为特定列附加值?
  4. 我能够读取CSV,获取数组或哈希。

3 个答案:

答案 0 :(得分:165)

正如迈克布所指出的,有文档 - 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

result,一个名为“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

答案 1 :(得分:4)

您是否看过Ruby的CSV课程?看起来很全面。看看这里: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

答案 2 :(得分:0)

您可能希望使用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]

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