Как преобразовать хэш в массив с определенным порядком? (Рубин) - PullRequest
2 голосов
/ 23 января 2010

У меня есть хэш хэшей (@post), и я хочу сохранить его в csv. Для меня странно, что мой подход работает для заголовка, но не для строк. Если я отображаю строки, используя

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

Я вижу правильные строки на экране, но CSV-файлы содержат значения хеш-ключа, а не значения хеш-значений. В основном у меня есть 5 строк заголовка в моем CSV вместо правильных значений.

Я думаю, что мне нужно преобразовать хеш @post [key] в массив с порядком, основанным на @post_csv_order (содержит ключи для хеша @post [key]). Существует метод хеширования to_a , но это не даст мне порядок, который мне нужен.

Полагаю, вы могли бы предложить другой подход и не использовать хэш хэша, но я также хотел бы знать, как преобразовать хэш в массив, имеющий некоторый предопределенный порядок .

С другой стороны, если есть какой-нибудь простой способ сохранить хеш хэшей в csv / table Я с удовольствием переписываю свой код.

  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

1 Ответ

3 голосов
/ 23 января 2010

Эта строка:

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

зацикливается на массиве @post_csv_order и возвращает сам массив, а это не то, что вам нужно. each и блок на самом деле ничего не делают в этом контексте. Если вы измените each на map, он будет делать то, что вы хотите:

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

map возвращает новый массив, содержащий результат каждого вызова блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...