2010-10-05 14 views
0

J'ai un fichier CSV que je suis en train d'analyser et d'en insérer des bits dans une base de données. Je voudrais écrire un analyseur qui tient compte du fait que l'ordre des colonnes pourrait changer dans le futur. J'ai pensé que je pourrais le faire en saisissant la ligne d'en-tête comme un tableau, et pour chaque ligne, en mettant la valeur dans une variable locale créée dynamiquement (en utilisant eval). Cependant, cela ne semble pas fonctionner, car les variables locales ne semblent pas accessibles en dehors de l'évaluation. J'ai lu ailleurs que cela peut être correct en Ruby 1.9, mais j'utilise 1.8.7Création dynamique de variables locales dans Ruby

code tel que:

headers = ["a", "b"] 
    headers.each do |h| 
    p e_str = h+"=1" 
    eval(e_str) 
end 
puts a 

ne fonctionne tout simplement pas, ce qui donne

test.rb: 6: variable locale définie ou méthode `a » pour principal: Object (NameError)

si la ligne 3 gravures "a = 1" et "b = 1" comme prévu

Est-ce que quelqu'un sait comment je pourrais m'y prendre?

+1

Ne faites pas cela. Utilisez des méthodes à la place (voir OpenStruct). – Reactormonk

Répondre

1

Vous pouvez obtenir un effet similaire en utilisant un openstruct

require 'ostruct' 

x = OpenStruct.new 

headers = ["a", "b"] 
headers.each do |h| 
    x.send("#{h}=", 1) 
end 
puts x.a 
puts x.b 
+0

pas besoin d'exiger 'ostruct' dans les rails :) –

2

Compte tenu data.csv

"foo","bar","baz" 
1,2,3 
4,5,6 

puis

#!/usr/bin/ruby1.8 

require 'csv' 

rows = CSV.readlines('data.csv') 
header = rows[0] 
data = rows[1..-1].map do |row| 
    {}.tap do |h| 
    header.each.with_index.map do |name, i| 
     h[name] = row[i] 
    end 
    end 
end 

p data 
# => [{"baz"=>"3", "foo"=>"1", "bar"=>"2"}, {"baz"=>"6", "foo"=>"4", "bar"=>"5"}] 

Note: Exiger 1.8.7 ou version ultérieure.

+0

Comme le dit @ wayne-conrad, il est préférable de simplement utiliser l'analyseur csv de la bibliothèque standard. Voir plus ici: http://ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html –

Questions connexes