我有一个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 等等,但永远无法正确显示。任何想法都将不胜感激。
答案 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