0

我在理解如何从 CSV 文件中获取数据以在其他地方使用时遇到了一些麻烦。

我的代码目前只有:

CSV.foreach("../../lib/modules/csv.csv") do |row|
    # use row here...

    def initialize(headers, fields, header_row = false)  
  end
end  

这就是我可以从 Ruby 文档中真正学到的全部内容。似乎没有任何关于如何选择标题然后在该标题下获取单元格的示例?

如果我解释得不够好,这里是一个示例表的快速模型:

 title  |  description  |  priority 
----------------------------------   
 story1 |    example1   |     6
----------------------------------     
 story2 |    example2   |     7
----------------------------------  
 story3 |    example3   |     8
----------------------------------  

如何获取要存储在字符串中的数据?:

example = column[i]
4

2 回答 2

1

您可以使用行变量的索引访问单个单元格。

CSV.foreach("../../lib/modules/csv.csv", headers: true) {|row| puts "#{row[0]} - #{row[1]} #{row[2]}" }

如果您设置headers:true,那么每个row都是一个实例,CSV::Row并且您的 csv 的第一行被视为标题行。它会输出

story1 - example1 - 6
story2 - example2 - 7
story3 - example3 - 8 

但是,如果您将headers:false每个设置row为的实例,Array它将打印 -

title - description - priority
story1 - example1 - 6
story2 - example2 - 7
story3 - example3 - 8
于 2012-10-08T14:25:21.640 回答
1

从一行中获取值时,可以通过索引获取值(如 Ashish 所示)。您也可以根据标题描述获取它,这听起来像是您想要的。

以下示例显示了如何创建包含“描述”列中所有值的数组:

all_descriptions = Array.new
CSV.foreach("test.csv", :headers=>true, :header_converters=>:symbol) do |row|
    all_descriptions << row[:description]
end  
all_descriptions
#=> ['example1', 'example2', 'example3']

如您所见,您可以使用 获取每一行的描述值row[:description],其中:description的列标题变成了一个符号。

请注意,如果您想存储该值以供以后在循环中使用,它看起来像:

CSV.foreach("test.csv", :headers=>true, :header_converters=>:symbol) do |row|
    example = row[:description]
    #do stuff
    if example =~ /something/
      #do other stuff
    end
end 
于 2012-10-09T13:30:18.173 回答