Лучший способ разобрать большой и сложный файл Json с помощью OpenRefine (или R)

Я знаю, как анализировать json-ячейки в Open Refine, но это слишком сложно для меня.

введите здесь описание изображения

Я использовал API для извлечения календаря 4730 комнат AirBNB, идентифицированных по их идентификаторам.

Вот пример одного файла Json: https://fr.airbnb.com/api/v2/calendar_months?key=d306zoyjsyarp7ifhu67rjxn52tv0t20¤cy=EUR&locale=fr&listing_id=4212133&month=11&year=2016&count=12&_format=with_conditions

Для каждого идентификатора и каждого дня года с настоящего момента до ноября 2017 года я хотел бы извлечь доступность этой комнаты (правда или ложь) и ее цену на этот день.

введите здесь описание изображения

Я не могу понять, как разобрать эту информацию. Я предполагаю, что это подразумевает серию вложенных forEach, но я не могу найти правильный способ сделать это с помощью Open Refine.

Я пробовал, конечно,

forEach(value.parseJson().calendar_months, e, e.days) 

Результатом является массив массивов словарей, который меня сбивает.

Любая помощь будет оценена. Если операция слишком сложна в Open Refine, мне также подойдет решение с R (или Python).


person Ettore Rizza    schedule 21.11.2016    source источник


Ответы (2)


Я думаю, вы на правильном пути. Результат:

forEach(value.parseJson().calendar_months, e, e.days) 

трудно читать, потому что OpenRefine и JSON используют квадратные скобки для обозначения массивов. То, что вы получаете из этого выражения, представляет собой массив ИЛИ, содержащий двенадцать элементов (по одному на каждый месяц года). Элементы в массиве OR представлены в формате JSON, каждый из которых представляет собой массив дней в месяце.

Чтобы сделать шаги управляемыми, я бы предложил решить это следующим образом:

Первое использование

forEach(value.parseJson().calendar_months,m,m.days).join("|")

Вы должны использовать «объединение», потому что ИЛИ не может хранить массивы ИЛИ непосредственно в ячейке — это должна быть строка.

Затем используйте «Редактировать ячейки-> Разделить многозначные ячейки» — это даст вам 12 строк на идентификатор, каждая из которых содержит выражение JSON. Теперь для каждого идентификатора у вас есть 12 строк в ИЛИ

Затем используйте:

forEach(value.parseJson(),d,d).join("|")

Это разбивает JSON на отдельные дни.

Затем снова используйте «Редактировать ячейки-> Разделить многозначные ячейки», чтобы разделить детали для каждого дня в отдельной ячейке.

Используя URL-адрес JSON из приведенного выше примера, это дает мне 441 строку для одного идентификатора, каждая из которых содержит JSON, описывающий доступность и цену за один день. На этом этапе вы можете использовать функцию «заполнить» в столбце идентификатора, чтобы заполнить идентификатор для каждой из строк.

Теперь у вас есть довольно простой JSON в каждой ячейке, поэтому вы можете извлечь доступность, используя

value.parseJson().available

и т.п.

person Owen Stephens    schedule 21.11.2016
comment
оно работает ! Большое спасибо, Оуэн. :) Я слишком зациклился на решении задачи одной сложной формулой. Кроме того, результат forEach(value.parseJson(), calendar_months, m, m.days).join(|) дал ответ в квадратных скобках, из-за чего я подумал, что это другой массив Open Refine. Спасибо еще раз. - person Ettore Rizza; 21.11.2016

Вместо того, чтобы просто создавать свой проект в виде текста и работать с GREL для анализа...

Лучше всего просто выбрать часть записи JSON, с которой вы хотите работать, с помощью нашего мастера визуального импорта для файлов JSON и XML (вы даже можете использовать URL-адрес, указывающий на файл JSON, как в вашем примере). (В видеоуроке показано, как это сделать: https://www.youtube.com/watch?v=vUxdB-nl0Bw )

  1. Выберите часть JSON, содержащую ваши записи, которые вы хотите проанализировать и с которыми работать (это может быть любая повторяющаяся часть, просто выберите одну из них, и OpenRefine извлечет все остальные) введите здесь описание изображения

  2. Ограничьте количество строк данных, которые вы хотите загрузить во время создания, или оставьте значения по умолчанию для всех строк. введите здесь описание изображения

  3. Нажмите «Создать проект», и теперь вы находитесь в режиме «Строки». Однако, если вы считаете, что режим «Записи» может лучше подходить для контекста, просто снова импортируйте проект как JSON, а затем выберите следующую внешнюю область содержимого, возможно, больший массив, содержащий ключевое поле и т. д. В примере ключ Поле, вероятно, будет датой, и почему я выделяю всю запись для данной даты. Таким образом, OpenRefine будет иметь ключи для каждой записи, а режим Records позволит вам работать с ними лучше, чем режим Row.

Не стесняйтесь взять этот пример и сделать его лучше и еще более полезным для всех, добавив его в наш раздел Wiki на Как использовать

person Thad Guidry    schedule 22.11.2016
comment
Танкс, Тэд. Я знаю этот метод. Но в этом случае у меня было более 4700 ссылок/файлов Json, извлеченных с помощью столбца «Добавить» путем получения URL-адресов. - person Ettore Rizza; 24.11.2016