それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Ruby のHash Arrayの入れ替え

HashとArrayはRubyにおいて同一に扱える。

2x1 の行列は、Hashになる。

2xn のn行配列はHashにできる

サンプル

a-f の文字列で配列を作る

>> ("a".."f").map{|e| e} 
=> ["a", "b", "c", "d", "e", "f"]

これを [[a,97],[b,98],,,,,]と文字と文字コードの配列の配列にする

>> ("a".."z").map{|e| [e,e[0]]}
>> ("a".."f").map{|e| [e,e[0]]}
=> [["a", 97], ["b", 98], ["c", 99], ["d", 100], ["e", 101], ["f", 102]]

これを{ "a"=>97 , "b"=>98,,,} のようなハッシュにする

>> Hash[*("a".."f").map{|e| [e,e[0]]}.flatten]
=> {"f"=>102, "e"=>101, "d"=>100, "c"=>99, "b"=>98, "a"=>97}

簡単ですね。flattenがミソ。

変換をミスると悲劇に。

>> Hash[*("a".."f").map{|e| [e,e[0]]}]
=> {["a", 97]=>["b", 98], ["e", 101]=>["f", 102], ["c", 99]=>["d", 100]}

配列をキーにした、Hashが出来る。(配列がHashにキーになって驚き!!)

何に使うのか?

結構便利。CSVファイルの読み書きに便利だと思いました。
CSVを読み書きするのです

f = open test.csv , r
str = f.read
str = str.toutf8
csv = str.lines.map{|e| e.split /,/ } 
header = csv.shift #ヘッダ行を考慮する。
csv.map{|e|  Hash[ *header.zip(e) ]}

csv.map{|e|  Hash[*header.zip(e).flatten]} #これを yieldで出せれば完璧ね。

list = csv.map{|e|  Hash[*header.zip(e).flatten]}


そこそこそ行けそう