背景
研究用ツールで途中結果をRubyのHashを文字列化して出力していました.以下のような感じ(1行だけ).
[{"s"=>"b22/fcbbdb25faf312a2e7a720ed878259e39f371be5", "a"=>"b21/e34c6c9c71e5b6a76bc7efed9d78a681e8817eff", "v"=>{"d"=>4836, "o"=>1}}]
別のツールでこれを読み込んでHashとして使うのに特別なことはしなくてよいと勘違いしていました...
例えば,上の文字列をgets.chompで読み込んで,そのままHash化できると勝手に思っていました.ChatGPTに聞くとto_hってあるから使えよって返事が返ってきましたがそんなメソッドはないとのこと.
調べると以下の記事が見つかりました.色々と方法があるようですが,標準でjsonのパーサがあるのでそれを使うといいよということ.
ただ,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しなくてよいよ.
でわ!