2010-01-23 5 views
2

J'ai un hachage de hashes (@post) et je veux l'enregistrer en csv. Étrange pour moi, c'est que mon approche fonctionne pour l'en-tête mais pas pour les lignes. Si j'affiche les lignes à l'aidecomment convertir un hachage dans un tableau avec un ordre particulier? (ruby)

csv << (@post_csv_order.each {|element| puts single_post[element]})

Je peux voir les chaînes droite sur l'écran, mais les fichiers csv contient des valeurs de la clé de hachage pas les valeurs des valeurs de hachage. Fondamentalement, j'ai 5 lignes de l'en-tête dans mon csv au lieu des bonnes valeurs.

Je pense que je dois convertir @post [clé] hachage dans un tableau avec un ordre basé sur @post_csv_order (contient des clés pour le hachage @post [clé]) Il y a une méthode de hachage to_a mais ça ne me donnera pas l'ordre dont j'ai besoin.

Je suppose que vous pourriez suggérer une approche différente et ne pas utiliser hash de hachage, mais je voudrais aussi savoir comment convertir hachage dans un tableau qui a un ordre prédéfini.

D'autre part, s'il y a un moyen facile comment enregistrer un hachage de hachages dans csv/table Je suis heureux de réécrire mon code.

require 'rubygems' 
    require 'faster_csv' 
    require 'pp' 

    @post = {123 => {"ForumID" => "123", "Post author" => "Thom" }, 
      222 => {"ForumID" => "222", "Post author" => "Mark"}, 
      345 => {"ForumID" => "345", "Post author" => "Eddy"}, 
      444 => {"ForumID" => "444", "Post author" => "Eli"}} 
    @post_csv_order = [ 
         "ForumID" , 
         "Post author" 
        ] 

    FasterCSV.open("test.csv", "w", { :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true, :return_headers => false, :force_quotes => true}) do |csv| 
    csv << (@post_csv_order.each {|element| element}) 
     @post.each_value do |single_post| 
     csv << (@post_csv_order.each {|element| single_post[element]}) 
    #csv << (@post_csv_order.each {|element| puts single_post[element]}) 
     end 
    end 

Répondre

3

Cette ligne:

csv << @post_csv_order.each {|element| single_post[element]} 

boucles sur le tableau @post_csv_order et retourne le tableau lui-même, ce qui est pas ce que vous voulez. Le each et le bloc ne font rien dans ce contexte. Si vous changez each à map il fera ce que vous voulez:

csv << @post_csv_order.map {|element| single_post[element]} 

map retourne un nouveau tableau contenant le résultat de chaque appel du bloc.

+0

@Theo: merci pour la solution. Je ne comprends pas pourquoi 'csv << (@ post_csv_order.each {| element | element})' pour les en-têtes fonctionne – Radek

+1

Cela fonctionne car tout ce qu'il fait est 'csv << @ post_csv_order', et' @ post_csv_order' contient les en-têtes. Le '.each {| element | element} '(en plus d'être un no-op en soi) n'a aucun effet. 'each' renvoie le tableau lui-même, le destinataire du message. 'each' est juste une construction en boucle et ce n'est utile que si la boucle a des effets secondaires, ce que vos boucles ne font pas. Vous utilisez 'each' comme s'il s'agissait de' map'. – Theo

Questions connexes