web-dev-qa-db-fra.com

En Ruby, comment lire les données d'une colonne à partir d'un fichier CSV?

Je sais comment ça se fait par rangée

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

Mais je suis complètement perdu en termes de colonne?

15
Pratik Bothra

C'est la solution les gars:

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

Désolé pour le poster dans le format correct si tard.

11
Pratik Bothra

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

Accès par 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]

Notez que dans le dernier cas, les colonnes sont accessibles par leur nom symbolisé et que les chaînes sont converties en nombres lorsque cela est possible.

30
steenslag

Transpose votre fichier CSV. En faisant cela, vos lignes se transforment en colonnes et vice versa. Ci-dessous, un exemple simple de transposition.

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

Bored alors décidé de cuisiner une solution alternative ici. Ne fonctionne (ici) que si la première ligne a le nombre maximum de colonnes

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

Maintenant, vous devriez pouvoir accéder à chaque colonne par son index

0
boulder_ruby