2016-05-18 35 views
1

私はRubyとjsonの新機能です。CSVをネストされたRubyハッシュ/ JSONに変換する

パイプで区切られた形式のインベントリをjsonに変換したいと考えています。

私はここにConvert csv to json in ruby

を例にしようとしたが、データがために、列の試合でネストされている値に変換されますフラットな形式であると私はロジックと結び目に縛らビットを取得しています私のようなJSONに変換しようとしています

id|shelf|package|price 
cupboarda|shelf1|can1|10 
cupboarda|shelf1|box1|20 
cupboarda|shelf2|can1|10 
cupboarda|shelf2|box1|20 
cupboarda|shelf3|can1|30 

: - - 例:csvファイルは次のようになります

{ 
    "id": "cupboarda", 
    "shelf": { 
    "shelf1": { 
     "package": { 
     "can1": { 
      "price": "10" 
     }, 
     "box1": { 
      "price": "20" 
     } 
     } 
    }, 
    "shelf2": { 
     "package": { 
     "can1": { 
      "price": "10" 
     }, 
     "box1": { 
      "price": "20" 
     } 
     } 
    }, 
    "shelf3": { 
     "package": { 
     "can1": { 
      "price": "30" 
     } 
     } 
    } 
    } 
} 

私は私が考えます右のトラックにリンクの例がありますが、ちょっと入れ子になってしまいます。

これは、すべてを一種のブロックにする方法として試したものです。フィールドを抽出して入れ子にされたJSONまたはネストされたハッシュにすることができます。他の何か。ノットで私を拘束何

require 'csv' 
csv_data = CSV.read 'data.csv', :col_sep => "|" 
headers = csv_data.shift.map {|i| i.to_s } 
string_data = csv_data.map {|row| row.map {|cell| cell.to_s } } 
array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] } 

puts "Array" 
p array_of_hashes 

は、IDの値を使用し、お互いの下にデータをスリットし、巣を開始する方法を把握しようとしています。 ロジック部分が私のレンガの壁であるようにRubyを使い始めると、上記のコードは、私が思っていたものを私に与えたと思っていましたが、最良の方法ではないかもしれません。

更新>

まだ、このロジックのまわりで私の頭をラップしようとしているが、これまでのところ、これは私が得ているか離れている: -

require 'csv' 
require 'json' 

csv_data = CSV.read 'inv.csv', :col_sep => "|" 
headers = csv_data.shift.map {|i| i.to_s } 
string_data = csv_data.map {|row| row.map {|cell| cell.to_s } } 
array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] } 

summary = {} 
array_of_hashes.each do |rec| 
    ida, shelfa, packagea, pricea = rec.values_at('id','shelf','package','price') 
    ((summary[ida] ||= {})[shelfa] ||= {})[packagea] ||= 0 
    summary[ida][shelfa][packagea] = pricea 
end 
puts summary.to_json 
puts summary 

は私が入れた場合、私が望むものに近いものを作り出しますinv.csvというファイル内のデータ

私はちょうど私がそれのようコンパクトにできる人を把握する必要があり

{"cupboarda":{"shelf1":{"can1":"10","box1":"20"},"shelf2":{"can1":"10","box1":"20"},"shelf3":{"can1":"30"}}} 
{"cupboarda"=>{"shelf1"=>{"can1"=>"10", "box1"=>"20"}, "shelf2"=>{"can1"=>"10", "box1"=>"20"}, "shelf3"=>{"can1"=>"30"}}} 

この出力を得る: -

{"cupboard":"cupboarda","shelf":{"shelf1":{"package":{"can1":{"price":"10"},"box1":{"price":"20"}}},"shelf2":{"package":{"can1":{"price":"10"},"box1":{"price":"20"}}},"shelf3":{"package":{"can1":{"price":"30"}}}}} 
+0

あなたの努力をしてください。 –

+0

あなたは何を試してみましたか?実際のコードを投稿してください。 –

+0

まず、リンクで例を試しました。この例をハッシュ配列 'require 'csv'に変換しようとしました。 csv_data = CSV.read 'data.csv'、:col_sep =>" | " headers = csv_data.shift.map {| i | i.to_s} string_data = csv_data.map {| row | row.map {| cell | cell.to_s}} array_of_hashes = string_data.map {| row |私はいくつかのユニークな値を抽出していくつかの検索を実行して入れ子になった出力を生成することを計画しました 'cupboard = array_of_hashes。マップ{| h | h ["cupboard"]} .uniq ' – Steve

答えて

-2

あなたはどのような言語を使用していますか?

Googleの "jsfiddle csv json"とc# take a look at this questionのjavascriptルックアップを参照してください。私のC#プロジェクトでは、NewtonSoft's brilliant JSONフレームワークを利用しています。

+0

あなたは質問のタイトルを読んだことがありますか? _ CSVをネストされた** Ruby **ハッシュ/ JSON_に変換します。この質問もルビーとタグ付けされています。 –

+0

OK、なぜ私の答えは投票されたのですか?彼は彼が使用していた寛容を特定せず、私は彼にいくつかの一般的な指針を与えた。あなたがリンクを読んだり従ったりするのを気にしたら... – err1

+0

ルビーでそれをしようとする – Steve

関連する問題