在 GREL (OpenRefine) 中解析多值 JSON
Posted
技术标签:
【中文标题】在 GREL (OpenRefine) 中解析多值 JSON【英文标题】:Parse multivalued JSON in GREL (OpenRefine) 【发布时间】:2017-05-20 23:58:45 【问题描述】:我有一个专栏,内容如下:
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 数组(即多个值)的单元格与不包含 JSON 数组的单元格之间的差异。
解决这个问题有不同的方法,最好的方法可能取决于数据的整体一致性。
我的第一个建议是使用过滤器或构面分别处理单个值和数组单元格。鉴于您在示例中使用的数据,我认为以下方法可行:
1) 使用 GREL 在列上创建自定义文本构面
value.startsWith("[")
2) 从构面中选择“false”以使用单值单元格 3) 对于这些单元格,请使用 GREL
value.parseJson().resource
4) 从构面中选择“true”以使用数组单元格 5) 对于这些单元格,请使用 GREL
forEach(value.parseJson(),v,v.resource)
(注意,这与您在问题中提到的 GREL 略有不同)
6) 这个 GREL 的输出是一个 OpenRefine 数组。您需要将其转换为字符串以将输出存储在单元格中 - 因此您可能需要使用以下内容:
forEach(value.parseJson(),v,v.resource).join("|")
【讨论】:
如果您希望在一行中完成,您可以使用:if(value.startsWith("["),forEach(value.parseJson(),v,v.resource).join("|"),value.parseJson().resource)
以上是关于在 GREL (OpenRefine) 中解析多值 JSON的主要内容,如果未能解决你的问题,请参考以下文章
python 基于gazeeter在OpenRefine中检测比利时城市名称的Jython天真方法