JSON字段转换为CSV

时间:2018-12-13 12:46:25

标签: ruby-on-rails json ruby

我有一个Postgres JSON字段-在调用JSON.parse之后,我得到了一个哈希数组-这是一个示例:

let cell = collectionView.cellForItem(at:indexPath) as! cellRegisterMarket

我有一种提取城市,州和邮政编码的方法。我有另一种将其插入CSV的方法。这是我的提取方法:

[{"fips": "12345, "city": "Atlanta", "state": "IL", "zip": "61723"}, {"fips": "24567", "city": "Lincoln", "state": "IL", "zip": "62656"}]

我需要CSV文件中的单元格如下所示:

def address(in_arr)
  in_arr.map do |h|
    h.select { |k, v| "#{k}: #{v}\n" unless k.eql?('fips') }
  end
end

等...

但是我得到了:

city: Atlanta
state: IL
zip: 61723

我尝试了 map 而不是 select ,我尝试在内部 select 中插入 puts 等等,但永远无法正确显示。任何想法都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您的数据采用以下格式,

 data = [{"city"=>"Atlanta"}, {"state"=>"IL"}, {"zip"=>"61723"}]

创建csv以以下格式写入文件

CSV.generate(headers: false) { |csv| hash.map(&:to_a).each { |row| csv << row } }

# => "\"[\"\"city\"\", \"\"Atlanta\"\"]\"\n\"[\"\"state\"\", \"\"IL\"\"]\"\n\"[\"\"zip\"\", \"\"61723\"\"]\"\n"

CSV.generate是转换csv格式的数据的正确方法。

答案 1 :(得分:2)

解决问题的最简单方法是,假设您取回正确的哈希,则仅返回当前哈希的值。您可以使用ruby API中定义的哈希值方法。

通过执行以下操作,我能够达到预期的结果,

ex_hash = [
          {'fips': '12345', 'city': 'Atlanta', 'state': 'IL', 'zip': '61723'}, 
          {'fips': '24567', 'city': 'Lincoln', 'state': 'IL', 'zip': '62656'}
        ]

keys_to_extract = [:city, :state, :zip]

address_values = []
ex_hash.each do |h| # iterate over the hash
  address_values << h.select { |k,_| keys_to_extract.include? k }.values # extract values 
end

puts address_values.inspect # [["Atlanta", "IL", "61723"], ["Lincoln", "IL", "62656"]]

或者另外,如Aleksei Matiushkin的评论中所述。

address_values = ex_hash.map { |h| h.select { |k,_| keys_to_extract.include? k }.value }

答案 2 :(得分:1)

input.map { |hash| hash.to_a[1..-1].map { |e| e.join(': ') } }
#⇒ [["city: Atlanta", "state: IL", "zip: 61723"],
#   ["city: Lincoln", "state: IL", "zip: 62656"]]

input.map do |hash|
  hash.reject { |k, _| k == :fips }.map(&:zip).map { |e| e.join(': ') }
end

keys = %i|city state zip|
input.map do |hash|
  keys.zip(hash.values_at(*keys)).map { |e| e.join(': ') }
end