我有一个名为“A.csv”的CSV文件。我需要生成一个名为“B.csv”的新CSV文件,其中包含来自“A.csv”的数据。
我将使用“A.csv”中的一个列子集,并且必须将一个列的值更新为“B.csv”中的新值。然后我使用B.csv中的这些数据在数据库中进行验证。
我能够读取CSV,获取数组或哈希。
答案 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
与上述几乎相同的论坛,而不是使用“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.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
方法特别感兴趣。这将允许您遍历输入和/或输出中不同的列索引位置,并从一个复制到另一个或向输出添加新值。如果我能正常使用,我会回来并发布示例。