私は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"}}}}}
あなたの努力をしてください。 –
あなたは何を試してみましたか?実際のコードを投稿してください。 –
まず、リンクで例を試しました。この例をハッシュ配列 '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