memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

RubyでファイルにHashを出力しておくとあとで戻すときに簡単と思っていた ⇒ 間違い

背景

研究用ツールで途中結果をRubyのHashを文字列化して出力していました.以下のような感じ(1行だけ).

[{"s"=>"b22/fcbbdb25faf312a2e7a720ed878259e39f371be5", "a"=>"b21/e34c6c9c71e5b6a76bc7efed9d78a681e8817eff", "v"=>{"d"=>4836, "o"=>1}}]

別のツールでこれを読み込んでHashとして使うのに特別なことはしなくてよいと勘違いしていました...

例えば,上の文字列をgets.chompで読み込んで,そのままHash化できると勝手に思っていました.ChatGPTに聞くとto_hってあるから使えよって返事が返ってきましたがそんなメソッドはないとのこと.

調べると以下の記事が見つかりました.色々と方法があるようですが,標準でjsonのパーサがあるのでそれを使うといいよということ.

stackoverflow.com

ただ,JSONでは「key : value」で,RubyのHashは「key => value」なので置換するのに「gsub('=>', ':')」を使う必要があるよってことでした.

コード

上記の文字列を想定して処理するコードは以下のようになります.余計な文字列をsplit処理するコードもついていますが,まぁ何かの役にたてば.

require 'json'

while line = gets
  h = JSON.parse line.gsub('=>', ':')
  puts "#{h[0]['s'].split('/')[1]}\t#{h[0]['a'].split('/')[1]}\t#{h[0]['v']['d']}\t#{h[0]['v']['o']}"
end

結論

RubyのHashオブジェクトをファイルに保存するときにはString形式ではなくJSON形式にしておけばgsubしなくてよいよ.

でわ!