Разбор многозначного JSON в GREL (OpenRefine)
У меня есть столбец со следующим содержанием:
7. {"resource":"abc"}
8. [{"resource":"def"},{"resource":"ghi"}]
Я пытаюсь получить содержание "ресурса":
value.parseJson().resource
Работает. Если я попытаюсь получить содержимое многозначных ячеек, я не смогу заставить его работать. Я пытался в соответствии с https://github.com/OpenRefine/OpenRefine/wiki/GREL-Other-Functions:
forEach(value.parseJson().resource,v,v.resource)
Я получаю много ошибок, например:
7. {"resource":"abc"} Error: First argument to forEach is not an array
8. [{"resource":"def"},{"resource":"ghi"}] Error: Object does not have any field, including resource
И я могу получить только многозначные ячейки, но не однозначные ячейки с этой:
forEach(value.parseJson(),v,v.resource)
1 ответ
Проблема, с которой вы столкнулись, заключается в разнице между ячейками, которые содержат массивы JSON (т.е. с несколькими значениями), и ячейками, которые этого не делают.
Существуют разные способы решения этой проблемы, и наилучший подход может зависеть от того, насколько последовательны данные в целом.
Моим первым предложением было бы использовать фильтр или фасет для работы с отдельным значением и ячейками массива отдельно. Учитывая данные, которые вы используете в своем примере, я думаю, что будет работать следующее:
1) Создайте пользовательский текстовый фасет в столбце с помощью GREL
value.startsWith("[")
2) Выберите "false" в фасете для работы с ячейками с одним значением 3) Для этих ячеек используйте GREL
value.parseJson().resource
4) Выберите "true" в фасете для работы с ячейками массива. 5) Для этих ячеек используйте GREL.
forEach(value.parseJson(),v,v.resource)
(nb это немного отличается от GREL, который вы упоминаете в своем вопросе как ошибка)
6) Результатом этого GREL является массив OpenRefine. Вам нужно будет преобразовать это в строку, чтобы сохранить вывод в ячейке - поэтому вам может понадобиться что-то вроде:
forEach(value.parseJson(),v,v.resource).join("|")