Поле JSON в CSV - PullRequest
       9

Поле JSON в CSV

0 голосов
/ 13 декабря 2018

У меня есть поле Postgres JSON - после вызова JSON.parse я получаю массив хэшей - вот пример:

[{"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

Мне нужно, чтобы ячейки в моем CSV-файле выглядели так:

city: Atlanta
state: IL
zip: 61723

и т.д ...

, но я получаю:

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

Я пробовал map вместо select , я пытался вставить , вставляет во внутренний select и т. Д., Но он никогда не отображается правильно.Любые мысли будут оценены.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Ваши данные в следующем формате,

 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 формате.

0 голосов
/ 13 декабря 2018

Самый простой способ решить вашу проблему - просто вернуть значения вашего текущего хэша, предполагая, что вы получаете правильный хеш.Вы можете использовать метод значений хеш-функции, определенный в 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"]]

Или дополнительно, как упомянуто в комментариях Алексея Матюшкина.

address_values = ex_hash.map { |h| h.select { |k,_| keys_to_extract.include? k }.value }
0 голосов
/ 13 декабря 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...