En général, nous avions envie d'utiliser un champ :id
pour la clé de hachage, car ce serait la même que celle d'une clé primaire dans une table de base de données :
{"00001" => {:name => "Bob", :pay => 150, :age => 95 } }
Cela va créer un hachage à la recherche comme ça:
require 'ap'
# Pretend this is CSV data...
csv = [
%w[ id name pay age ],
%w[ 1 bob 150 95 ],
%w[ 2 fred 151 90 ],
%w[ 3 sam 140 85 ],
%w[ 31999 jane 150 95 ]
]
# pull headers from the first record
headers = csv.shift
# drop the first header, which is the ID. We'll use it as the key so we won't need a name for it.
headers.shift
# loop over the remaining records, adding them to a hash
data = csv.inject({}) { |h, row| h[row.shift.rjust(5, '0')] = Hash[headers.zip(row)]; h }
ap data
# >> {
# >> "00001" => {
# >> "name" => "bob",
# >> "pay" => "150",
# >> "age" => "95"
# >> },
# >> "00002" => {
# >> "name" => "fred",
# >> "pay" => "151",
# >> "age" => "90"
# >> },
# >> "00003" => {
# >> "name" => "sam",
# >> "pay" => "140",
# >> "age" => "85"
# >> },
# >> "31999" => {
# >> "name" => "jane",
# >> "pay" => "150",
# >> "age" => "95"
# >> }
# >> }
Ce n'est pas une pratique très évolutive. Une base de données simple utilisant Postgres, MySQL ou même SQLite serait facile à construire et à utiliser avec Ruby DBI au minimum, ou un ORM comme Sequel, ActiveRecord ou Datamapper. Ils ne seront pas aussi rapides qu'un hachage en mémoire, mais ils seront plus évolutifs. –
@Greg, je sais que ce n'est pas particulièrement évolutif mais comme l'ensemble de données est d'une taille relativement fixe et assez petit en ce moment, il devrait être bien. Merci pour votre solution ci-dessous, aussi :-) – mbm
@mbm la meilleure façon de le faire est d'utiliser la gemme 'smarter_csv' - voir ma réponse ci-dessous – Tilo