質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1698閲覧

rowハッシュの中から、予め決められたcolumn配列のものを取り出したいのですが、

YosukeNakayama

総合スコア80

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2015/11/06 15:18

ruby

1column = ["price", "url", "Totalweight", "memo", "id", "created_at", "updated_at"] 2 3row = {"asin"=>"test", "url"=>"test2", "price"=>3232, "Totalweight"=>95, "memo"=>nil, "tekitou" => "iranai", "sample" => "no need"} 4 5から 6 7row = {"asin"=>"test", "url"=>"test2", "price"=>3232, "Totalweight"=>95, "memo"=>nil}

rowハッシュの中から、予め決められたcolumn配列のものを取り出したいのですが、
row.slice(column[1])
row.slice(column[2])とやれば取り出せますが、

取り出したものをハッシュで取得するにはどうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

単純に each での繰り返しで書いてみました。
11.rb

ruby

1column = ["price", "url", "Totalweight", "memo", "id", "created_at", "updated_at"] 2row = {"asin"=>"test", "url"=>"test2", "price"=>3232, "Totalweight"=>95, "memo"=>nil, "tekitou" => "iranai", "sample" => "no need"} 3 4ans = {} 5column.each do |k| 6 ans[k] = row[k] if row.keys.include?(k) 7end 8p ans

実行結果:

$ ruby 11.rb {"price"=>3232, "url"=>"test2", "Totalweight"=>95, "memo"=>nil}

質問文では
row = {"asin"=>"test", ...
と asin が column には含まれていないのに抽出結果には asin が含まれていますが、
それは質問文の間違いと認識しています。

質問文では, row に絞り込んだ結果をいれていますが、↑のコードでは row は変化させていません。
必要なら row = ans として row に代入してください。

投稿2015/11/06 22:03

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YosukeNakayama

2015/11/07 04:36

ほーーーなるほど! if row.keys.include?(k)の条件下で、each文を使ったってことですか・・・! これも面白いです!!! ありがとうございます!!
guest

0

ベストアンサー

あらかじめ空のレコードを作っておきます。
対象レコードは、selectメソッドでcolumnに含まれているキーだけに絞ります。
絞ったレコードを、mergeメソッドで空のレコードに上書きします。

※とりあえずcreated_at, updated_atを除外しないで処理しています。

lang

1# 空のレコード 2empty_row = Hash[column.zip([])] 3p empty_row 4# {"price"=>nil, "url"=>nil, "Totalweight"=>nil, "memo"=>nil, "id"=>nil, "created_at"=>nil, "updated_at"=>nil} 5 6# 絞り込み 7narrowed = row.select{ |k, v| column.include?(k) } 8p narrowed 9# {"url"=>"test2", "price"=>3232, "Totalweight"=>95, "memo"=>nil} 10 11# 空レコードとマージ(非破壊) 12merged = empty_row.merge(narrowed) 13p merged 14# {"price"=>3232, "url"=>"test2", "Totalweight"=>95, "memo"=>nil, "id"=>nil, "created_at"=>nil, "updated_at"=>nil}

投稿2015/11/06 15:57

編集2015/11/06 16:02
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YosukeNakayama

2015/11/06 16:40

素晴らしいです!!!ありがとうございました!! 使ったことのないメソッドばかりで非常に勉強になりました。 ちなみに、narrowed = row.select{|k,v| column.include?(k)}は、 row.slice(*column)でもいけそうでした! ありがとうございます!
argius

2015/11/06 22:18 編集

解決となったようで、何よりです。 > row.slice(*column)でも Railsの場合なら、そちらの方が簡潔ですね。 (RailsでないRubyのつもりで回答してしまいました。Ruby単体だとHash#sliceは使えないようです。) 何をしているのかはご理解いただけたようですので、意味さえ同じなら問題ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問