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

时间:2013-01-30 06:55:49

标签: ruby-on-rails ruby csv

我知道如何按行完成

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

但我完全失去了专栏?

5 个答案:

答案 0 :(得分:31)

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')
p t[:no1] #=> [77489, 77559, 77787, 77251]

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

答案 1 :(得分:10)

这是解决方案的人:

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:0)

无聊所以决定在这里做一个替代解决方案。仅当第一行具有最大列数

时才有效(此处)
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

现在您应该能够通过索引

访问每一列

答案 4 :(得分:0)

'by_col'方法根据您选择的列为您提供输出。

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

代码:

CSV.parse(File.open('test_csv'), headers: true).by_col['surname']

输出:

['Palit','bargur','Roy','paul']