Ruby — FasterCSV после парсинга JSON

Я пытаюсь проанализировать ответ JSON для данных клиента (имена и адрес электронной почты) и создать CSV-файл с одинаковыми заголовками столбцов.

По какой-то причине каждый раз, когда я запускаю этот код, я получаю файл CSV со списком всех имен в одной ячейке (без разделения между именами... просто строка имен, добавленная друг к другу) и то же самое. вещь на фамилию. Следующий код не включает добавление электронных писем (об этом я позабочусь позже).

Код:

 def self.fetch_emails

    access_token ||= AssistlyArticle.remote_setup
    cust_response = access_token.get("https://blah.desk.com/api/v1/customers.json")
    cust_ids = JSON.parse(cust_response.body)["results"].map{|w| w["customer"]["id"].to_i}

 FasterCSV.open("/Users/default/file.csv", "wb") do |csv|
      # header row
      csv << ["First name", "Last Name"]
      # data rows
      cust_ids.each do |cust_firstname|
        json = JSON.parse(cust_response.body)["results"]
        csv << [json.map{|x| x["customer"]["first_name"]}, json.map{|x| x["customer"]["last_name"]}]
      end 
    end
  end

Вывод:

First Name        | Last Name
JohnJillJamesBill   SearsStevensSethBing

и так далее...

Желаемый результат:

First Name | Last Name
John       | Sears
Jill       | Stevens
James      | Seth
Bill       | Bing

Пример JSON:

{
    "page":1,
    "count":20,
    "total":541,
    "results":
    [
        {
            "customer":
            {
                "custom_test":null,
                "addresses":
                [
                    {
                        "address":
                        {
                            "region":"NY",
                            "city":"Commack",
                            "location":"67 Harned Road,
                             Commack,
                             NY 11725,
                             USA",
                            "created_at":"2009-12-22T16:21:23-05:00",
                            "street_2":null,
                            "country":"US",
                            "updated_at":"2009-12-22T16:32:37-05:00",
                            "postalcode":"11725",
                            "street":"67 Harned Road",
                            "lng":"-73.196225",
                            "customer_contact_type":"home",
                            "lat":"40.716894"
                        }
                    }
                ],
                "phones":
                [
                ],
                "last_name":"Suriel",
                "custom_order":"4",
                "first_name":"Jeremy",
                "custom_t2":"",
                "custom_i":"",
                "custom_t3":null,
                "custom_t":"",
                "emails":
                [
                    {
                        "email":
                        {
                            "verified_at":"2009-11-27T21:41:11-05:00",
                            "created_at":"2009-11-27T21:40:55-05:00",
                            "updated_at":"2009-11-27T21:41:11-05:00",
                            "customer_contact_type":"home",
                            "email":"[email protected]"
                        }
                    }
                ],
                "id":8,
                "twitters":
                [
                    {
                        "twitter":
                        {
                            "profile_image_url":"http://a3.twimg.com...",
                            "created_at":"2009-11-25T10:35:56-05:00",
                            "updated_at":"2010-05-29T22:41:55-04:00",
                            "twitter_user_id":12267802,
                            "followers_count":93,
                            "verified":false,
                            "login":"jrmey"
                        }
                    }
                ]
            }
        },
        {
            "customer":
            {
                "custom_test":null,
                "addresses":
                [
                ],
                "phones":
                [
                ],
                "last_name":"",
                "custom_order":null,
                "first_name":"[email protected]",
                "custom_t2":null,
                "custom_i":null,
                "custom_t3":null,
                "custom_t":null,
                "emails":
                [
                    {
                        "email":
                        {
                            "verified_at":null,
                            "created_at":"2009-12-05T20:39:00-05:00",
                            "updated_at":"2009-12-05T20:39:00-05:00",
                            "customer_contact_type":"home",
                            "email":"[email protected]"
                        }
                    }
                ],
                "id":27,
                "twitters":
                [
                    null
                ]
            }
        }
    ]
}

Есть ли лучшее использование FasterCSV, чтобы разрешить это? Я предполагал, что ‹‹ каждый раз будет добавляться к новой строке... но, похоже, это не работает. Буду признателен за любую помощь!


person ns1    schedule 04.09.2012    source источник
comment
Вы забыли показать нам образец JSON. Если ссылка, которую вы дали, умрет, вопрос будет бесполезен для людей, которые ищут решение похожей проблемы. Кроме того, вы вынуждаете любого, кто хочет вам помочь, раскопать его, а потом выяснять, что это фиктивный запрос.   -  person the Tin Man    schedule 04.09.2012
comment
Ты прав. Моя вина. Я добавил образец JSON. Спасибо за совет.   -  person ns1    schedule 04.09.2012
comment
какую версию рубина вы используете?   -  person Pritesh Jain    schedule 04.09.2012


Ответы (1)


У вас как-то все запуталось, слишком много раз парсите json (и внутри цикла!) Давайте попроще:

customers = JSON.parse(data)["results"].map{|x| x['customer']}
customers.each do |c|
  csv << [c['first_name'], c['last_name']]
end

также «wb» - неправильный режим для csv - просто «w».

person pguardiario    schedule 05.09.2012
comment
Ты великолепен. Большое спасибо! - person ns1; 05.09.2012