Разбор многозначного 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("|")
Другие вопросы по тегам