2017-01-06 7 views
3

У меня есть столбец со следующим содержанием:Анализировать многозначные JSON в Grel (OpenRefine)

7. {"resource":"abc"} 
8. [{"resource":"def"},{"resource":"ghi"}] 

Я пытаюсь получить содержимое "ресурс":

value.parseJson().resource 

Works. Если я попытаюсь получить содержимое многозначных ячеек, я не могу заставить его работать. Я попытался согласно 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) 

ответ

2

Проблема, которая возникает здесь, заключается в различии между ячейками, которые содержат массивы JSON (т.е. несколько значений), и теми, которые этого не делают.

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

Моим первым предложением было бы использовать фильтр или фасет для работы с отдельными ячейками и ячейками массива отдельно. Учитывая данные, которые вы используете в вашем примере я думаю, что следующее будет работать:

1) Создание пользовательского текста Facet на колонке с использованием Grel

value.startsWith("[") 

2) Выберите «лжи» от фаски работать с клетками единичных значений 3) для этих клеток используют Grel

value.parseJson().resource 

4) Выберите «истинный» из фасета, чтобы работать с клетками массива 5) для того чтобы эти клетки используют Grel

forEach(value.parseJson(),v,v.resource) 

(n.b. это немного отличается от GREL, о котором вы упоминаете в своем вопросе, как об ошибке)

6) Выходной сигнал этого GREL является массивом OpenRefine. Вам нужно будет преобразовать это в строку для хранения вывода в ячейке, поэтому вам может понадобиться что-то вроде:

forEach(value.parseJson(),v,v.resource).join("|") 
+1

Если вы предпочитаете делать это в одной строке, вы можете использовать: ' '' if (value.startsWith ("["), forEach (value.parseJson(), v, v.resource) .join ("|"), value.parseJson(). resource) '' ' –

+0

Большое спасибо , это сработало! –

 Смежные вопросы

  • Нет связанных вопросов^_^