2017-01-06 2 views
3

J'ai une colonne avec le contenu suivant:Parse multivalué JSON dans GREL (openrefine)

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

J'essaie d'obtenir le contenu de "ressource":

value.parseJson().resource 

Works. Si j'essaie d'obtenir le contenu de cellules à plusieurs valeurs, je ne peux pas le faire fonctionner. J'ai essayé selon https://github.com/OpenRefine/OpenRefine/wiki/GREL-Other-Functions:

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

Je reçois beaucoup d'erreurs, par exemple:

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 

Et je ne peux obtenir les cellules multivaluées, mais pas les cellules à valeur unique avec celle-ci:

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

Répondre

2

Un problème que vous avez ici est la différence entre les cellules qui contiennent des tableaux JSON (c'est-à-dire des valeurs multiples) et celles qui n'en contiennent pas.

Il existe différentes manières d'aborder ce problème, et la meilleure approche peut dépendre de la cohérence de l'ensemble des données. Ma première suggestion serait d'utiliser un filtre ou une facette pour travailler avec la seule valeur et les cellules de tableau séparément. Compte tenu des données que vous utilisez dans votre exemple, je pense que ce qui suit fonctionnerait:

1) Créer un texte personnalisé Facet sur la colonne à l'aide du GREL

value.startsWith("[") 

2) Sélectionnez « faux » de la facette au travail avec les cellules à valeur unique 3) pour ces cellules utilisent le GREL

value.parseJson().resource 

4) Sélectionnez « true » de la facette de travailler avec les cellules du tableau 5) pour ces cellules utilisent le GREL

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

(n.b. ceci est légèrement différent du GREL que vous mentionnez dans votre question comme donnant des erreurs)

6) La sortie de ce GREL est un tableau OpenRefine. Vous aurez besoin de convertir cela en une chaîne pour stocker la sortie dans une cellule - donc vous devrez utiliser quelque chose comme:

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

Si vous préférez le faire en une seule ligne, vous pouvez utiliser: ' '' if (value.startsWith ("["), forEach (valeur.parseJson(), v, v.resource) .join ("|"), valeur.parseJson(). resource) '' ' –

+0

Merci beaucoup , ça a marché! –