将CSV转换为嵌套的Ruby散列/ JSON

时间:2016-05-18 10:21:16

标签: ruby json csv

我是ruby和json的新手,所以可能会以错误的方式解决这个问题。

我想获取一个以管道分隔格式的库存并将其转换为json。

我在这里尝试过这个例子Convert csv to json in ruby

但是由于数据处于平面格式,并且将被转换为嵌套,其中列中的值匹配,例如csv文件将如下所示: -

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

我正在尝试将其转换为json,如: -

{
  "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或嵌套的哈希,然后我可以将其格式化为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"}}}}}

1 个答案:

答案 0 :(得分:-2)

您使用的是哪种语言?

对于javascript,在Google和c# take a look at this question中查找“jsfiddle csv json”。在我的c#项目中,我使用了NewtonSoft's brilliant JSON框架。