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

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

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

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

Q&A

解決済

4回答

5851閲覧

ハッシュにして出力したい

terate

総合スコア103

Ruby

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

0グッド

0クリップ

投稿2016/02/12 13:12

下記humans.csvをrbファイルで読み取って、記載した実行結果を出したいです。その際、途中まで書いて下記記載しているrbファイルのコードを使って出したいのですがどのように続きを書いたら良いでしょうか?1行目のname,gender,ageをハッシュのキーとして使用し出力するのはどうしたら良いのでしょうか?


#humans.csv

namae,seibetu,toshi↲
田中,女,21
浅見,男,30
諸田,女,22


ruby

1 ary=[] 2 File.open("humans.csv","r") do |f| 3 f.each_line do |line| 4 ary << line.chomp.split(",") 5 end 6 end

#出したい実行結果
[{"namae"=>"田中", "seibetu"=>"女", "toshi"=>21},
{"namae"=>"浅見", "seibetu"=>"男", "toshi"=>30},
{"namae"=>"諸田", "seibetu"=>"女", "toshi"=>22}]


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

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

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

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

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

guest

回答4

0

csvライブラリを使うと良いでしょう。

Ruby

1require "csv" 2list = CSV.read("human.csv", headers: true).map(&:to_hash) 3p list

投稿2016/02/12 21:28

raccy

総合スコア21733

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

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

terate

2016/02/13 07:42 編集

ありがとうございます!わざわざ面倒なのは承知なのですが仮にrequire ”csv”を用いず、質問文で途中まで書き上げてる分から追加変形させてコーディングしたい場合どのようなコードになるのかもしお伺いできたらさせてください。 それとcsv.tableとcsv.readでどちらも同じ結果を得られるようですが何か違いはあるのでしょうか?
guest

0

Ruby

1ary=[] 2hash_ary=[] 3loop_count = 0 4File.open("humans.csv","r") do |f| 5 f.each_line do |line| 6 if loop_count == 0 then 7 next 8 end 9 ary = line.chomp.split(",") 10 hash_ary_c = {} 11 hash_ary_c["namae"]=ary[0] 12 hash_ary_c["seibetu"]=ary[1] 13 hash_ary_c["toshi"]=ary[2] 14 hash_ary.push(hash_ary_c) 15 loop_count += 1 16 end 17end 18 19p hash_ary 20
結果 [{"namae"=>"田中", "seibetu"=>"女", "toshi"=>"21"}, {"namae"=>"浅見", "seibetu"=>"男", "toshi"=>"30"}, {"namae"=>"諸田", "seibetu"=>"女", "toshi"=>"22"}]

投稿2016/02/12 13:34

編集2016/02/13 12:21
K_S_

総合スコア419

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

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

terate

2016/02/12 15:52

ありがとうございます!配列の中の最初のハッシュが、[{"namae"=>"namae", "seibetu"=>"seibetu", "toshi"=>"toshi"}となって表示されてしまうのですが、このCSVの1行目の項目(name,seibetu,toshi)をファイルを読み込んだ後にハッシュのキーとして利用する書き方はないでしょうか?まぎらわしく申し訳ありません。
K_S_

2016/02/13 12:24

修正しました。
terate

2016/02/15 00:35

ありがとうございます!修正いただいたのに気付かず今になってしまいました!大変勉強になります!本当にありがとうございます!
guest

0

ベストアンサー

... 質問文で途中まで書き上げてる分から追加変形させてコーディングしたい....

こんな風にしてはいかがでしょう。

ruby

1ary = [] 2File.open('humans.csv', 'r') do |f| 3 f.each_line do |line| 4 ary << line.chomp.split(',') 5 end 6end 7 8csv = [] 9keys = ary.shift.map(& :to_sym) 10ary.each_with_index do |row| 11 hash = {} 12 row.each_with_index do |x, idx| 13 hash[keys[idx]] = x 14 end 15 csv << hash 16end 17 18p csv

実行結果

[{:namae=>"田中", :seibetu=>"女", :toshi=>"21"}, {:namae=>"浅見", :seibetu=>"男", :toshi=>"30"}, {:namae=>"諸田", :seibetu=>"女", :toshi=>"22"}]

投稿2016/02/13 12:11

katoy

総合スコア22322

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

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

terate

2016/02/13 12:26

ありがとうございます!本当に助かります!
guest

0

質問文では、 hash の key は 文字列 "namae" のようになってますが、
:namae とシンボルにしたほうが良いと思います。

次のようのすれば、 キーはシンボルになります。

ruby

1require 'csv' 2 3csv = CSV.table('human.csv', headers: true).map(&:to_h) 4p csv

実行結果

[{:namae=>"田中", :seibetu=>"女", :toshi=>"21"}, {:namae=>"浅見", :seibetu=>"男", :toshi=>"30"}, {:namae=>"諸田", :seibetu=>"女", :toshi=>"22"}]

投稿2016/02/13 00:25

編集2016/02/13 11:47
katoy

総合スコア22322

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

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

terate

2016/02/13 07:42 編集

ありがとうございます!わざわざ面倒なのは承知なのですが仮にrequire ”csv”を用いず、質問文で途中まで書き上げてる分から追加変形させてコーディングしたい場合どのようなコードになるのかもしお伺いできたらさせてください。 それとcsv.tableとcsv.readでどちらも同じ結果を得られるようですが何か違いはあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問