2012-10-11 4 views
1

Je tire des données CSV puis les stocke en tant que tableaux. Je dois retourner ces tableaux sous la forme d'un seul Hash. Cela me permettra d'utiliser une clé pour chaque index, au lieu d'utiliser le numéro d'index, mais j'ai des problèmes pour le faire fonctionner. Il enregistre une erreur indiquant qu'il y a un mauvais nombre d'arguments.Stocker des tableaux sous forme de hachage?

Des idées où je me trompe?

code:

ref  = Array.new 
summary = Array.new 
pri  = Array.new 
state  = Array.new 
estdur = Array.new 
notes  = Array.new 
supporter = Array.new 
bz  = Array.new 
project = Array.new 
team  = Array.new 

hashed = Hash.new 

csvPath = "#{File.dirname(__FILE__)}"+"/../modules/csv.csv" 
CSV.foreach(csvPath, :headers=>true, :header_converters=>:symbol) do |row| 
    ref  << row [ :feature ] 
    summary << row [ :Summary ] 
    pri  << row [ :Pri  ] 
    state  << row [ :State  ] 
    estdur << row [ :EstDur ] 
    notes  << row [ :Notes  ] 
    supporter << row [ :Supporter ] 
    bz  << row [ :BZ  ] 
    project << row [ :Project ] 
    team  << row [ :Team  ] 
end 
return hashed[ 
    "ref",  ref, 
    "summary", summary, 
    "pri",  pri, 
    "state",  state, 
    "estDur", estdur, 
    "notes",  notes, 
    "supporter", supporter, 
    "bz",  bz, 
    "project", project, 
    "team",  team 
] 
+1

Postez le erreur exacte trace de la pile. Et indiquer quelle ligne est à l'origine de l'erreur. –

+0

@SergioTulentsev erreur est sur le retour à la fin, et comme indiqué ci-dessus, il est faux nombre d'arguments (20 pour 1) – samayres1992

+0

Au lieu de 'Hash.new' vous pouvez utiliser' {} 'comme JavaScript. 'Array.new' est équivalent à' [] '. – tadman

Répondre

7

La façon dont vous vous y prenez est plutôt confuse. Chaque fois que vous voyez un grand nombre de variables comme cela est un signe que vous devriez utiliser une méthode de stockage différente. Que vous les réduisiez en Hash avant de les retourner est un indice sur la façon dont ils devraient être stockés en premier lieu.

Voici une réélaboration qui est beaucoup plus Ruby saveur:

# Create a Hash where the default is an empty Array 
result = Hash.new { |h, k| h[k] = [ ] } 

# Create a mapping table that defaults to the downcase version of the key 
mapping = Hash.new { |h, k| h[k] = k.to_s.downcase.to_sym } 

# Over-ride certain keys that don't follow the default mapping 
mapping[:feature] = :ref 

csvPath = File.expand_path("/../modules/csv.csv", File.dirname(__FILE__)) 

CSV.foreach(csvPath, :headers => true, :header_converters => :symbol) do |row| 
    row.each do |column, value| 
    # Append values to the array under the re-mapped key 
    result[mapping[column]] << value 
    end 
end 

# Return the resulting hash 
result 
+0

+1 J'étais sur le point de passer en mode de révision de code, mais vous m'avez battu. –

+0

@tadman Je suis d'accord que c'est beaucoup plus propre, il me semble que la valeur de retour est nulle, même si si je l'utilise comme un tableau simple de tableaux, cela fonctionne très bien. Des suggestions pourquoi cela pourrait être? – samayres1992

+1

Assurez-vous que 'result' est la dernière ligne de votre méthode. – tadman

4

Utilisez ceci:

return Hash["ref", ref, "summary", summary, "pri", pri, "state", state, 
      "estDur", estdur, "notes", notes, "supporter", supporter, 
      "bz", bz, "project", project, "team", team] 

Pas besoin de variables hashed.

+2

Oups, vous étiez plus rapide :) –

+1

Pas besoin de 'return' non plus si c'est la dernière ligne de la méthode. – tadman

+0

Ouais c'est vrai, c'est là pour des raisons de clarté. – Matzi

Questions connexes