2016-08-05 7 views
-1

に書き込みます。 jsonファイルは次のようになります。RubyのJSONを超える反復とは、私はこのようなJSONファイルを持っているファイル

{ 
    "ABCD": [ ["Ax", "Bx", "Cx", "Dx"], ["Ax", "Bx", "Cx", "Dx"] ], 
    "EFGH": [ ["Ex", "Fx", "Gx", "Hx"], ["Ex", "Fx", "Gx", "Hx"] ], 
    "IJKL": [ ["Ix", "Jx", "Kx", "Lx"], ["Ix", "Jx", "Kx", "Lx"] ] 
} 

どうすればよいですか? 私はRubyを使ったことがありません...しかし、私はいくつかの便利なスクリプトから始めることを学びたいと思います。

+1

私は 'A1'などという名前のキーを見ません。それらはどこですか? – tadman

答えて

5

トリックの数はここに助けることができるEnumerableライブラリにあります:

require 'json' 

data = JSON.load <<END 
{ 
    "ABCD": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ], 
    "EFGH": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ], 
    "IJKL": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ] 
} 
END 

reworked = Hash[ 
    data.map do |key, values| 
    letters = key.chars 

    [ key, values.map { |a| letters.zip(a).map(&:join) }] 
    end 
] 

# => {"ABCD"=>[["Ax", "Bx", "Cx", "Dx"], ["Ax", "Bx", "Cx", "Dx"]], "EFGH"=>[["Ex", "Fx", "Gx", "Hx"], ["Ex", "Fx", "Gx", "Hx"]], "IJKL"=>[["Ix", "Jx", "Kx", "Lx"], ["Ix", "Jx", "Kx", "Lx"]]} 

ここHash[]は別のものに1つのハッシュを変換するのに有用である、とmapは、リスト内の再書き込みの各要素に使用されています。 zipはジッパーのように2つのアレイを組み合わせています。 charsは、文字列から個々の文字を簡単に取り出す方法です。

ファイルにこのバックを書きたい場合:

File.open('output.json', 'w') do |f| 
    f.write(JSON.dump(reworked)) 
end 
+0

外部のjsonをロードする必要がある場合は、次のように置き換えます。 'data = JSON.load(File.read(" data.json "))' right? – cocacrave

+1

実際には、ほとんどの非直列化関数はファイルハンドルを取ります。これはより効率的なメモリーになります。 'JSON.load(File.open( 'data.json'))'。 – tadman

関連する問題