在Ruby中,如何从CSV文件中逐列读取数据?

我知道它是如何按行完成的

CSV.foreach(filename.csv) do |row| puts "#{row}" end 

但我完全失去了专栏?

test.csv:

 name,surname,no1,no2,no3,date Raja,Palit,77489,24,84,12/12/2011 Mathew,bargur,77559,25,88,01/12/2011 harin,Roy,77787,24,80,12/12/2012 Soumi,paul,77251,24,88,11/11/2012 

通过cols访问:

 require 'csv' csv = CSV.read('test.csv', :headers=>true) p csv['name'] #=>["Raja", "Mathew", "harin", "Soumi"] #or even: t = CSV.table('test.csv') pt[:no1] #=> [77489, 77559, 77787, 77251] 

请注意,在最后一种情况下,cols由符号化名称访问,并且尽可能将字符串转换为数字。

这是解决方案的人:

 CSV.foreach(filename).map { |row| row[0] } 

很抱歉这么晚发布的格式正确。

转置您的CSV文件。 通过执行此操作,您的行将转换为列,反之亦然。 下面是一个简单的转置示例。

  irb(main):001:0> [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]].transpose => [["1", "4", "7"], ["2", "5", "8"], ["3", "6", "9"]] 

无聊所以决定在这里做一个替代解决方案。 仅在第一行具有最大列数时才起作用(此处)

 columns = {} rows.first.each_with_index do |col, i| columns[i] = [] end rows.each do |row| row.each_with_index do |cell, i| columns[i] = columns[i] + [cell] end end 

现在,您应该能够通过索引访问每个列