如何在新的OpenRefine列中仅保存特定的JSON元素

时间:2016-04-21 20:53:04

标签: openrefine google-refine

{
    "business_id": "SQ0j7bgSTazkVQlF5AnqyQ",
    "full_address": "214 E Main St\nCarnegie\nCarnegie, PA 15106",
    "hours": {},
    "open": true,
    ** "categories": ["Chinese", "Restaurants"] ** ,
    "city": "Carnegie",
    "review_count": 9,
    "name": "Don Don Chinese Restaurant",
    "neighborhoods": ["Carnegie"],
    "longitude": -80.0849615,
    "state": "PA",
    "stars": 2.5,
    "latitude": 40.4083473,
    "attributes": {
        "Take-out": true,
        "Alcohol": "none",
        "Noise Level": "quiet",
        "Parking": {
            "garage": false,
            "street": false,
            "validated": false,
            "lot": false,
            "valet": false
        },
        "Delivery": true,
        "Has TV": true,
        "Outdoor Seating": false,
        "Attire": "casual",
        "Waiter Service": false,
        "Accepts Credit Cards": true,
        "Good for Kids": true,
        "Good For Groups": false,
        "Price Range": 1
    },
    "type": "business"
}

value.parseJson()['categories']会在OpenRefine中创建一个名为'categories'的新列,但是是否可以过滤并保留'chinese'作为唯一值并删除任何其他值?

1 个答案:

答案 0 :(得分:0)

在上面的示例中,GREL表达式:

value.parseJson()['categories']

会产生一个包含两个值的数组:

["Chinese", "Restaurants"]

您可以使用作用于数组的GREL表达式来操纵它。例如,要选择数组中的第一个值,您可以使用:

value.parseJson()['categories'][0]

哪个会选择数组中的第一个条目(增加表达式末尾方括号中的数字以选择数组中的其他条目)

如果您要对数组中的特定值进行过滤,则可以使用'过滤器'表达式:

filter(value.parseJson()['categories'],v,v=="Chinese")

这将导致一个新的数组只包含"中文"在其中(在上面的例子中)。要将其存储在新列中,您需要将数组转换为字符串:

filter(value.parseJson()['categories'],v,v=="Chinese").join("")

为了避免区分大小写的问题,以及“中国人”的可能性。在'类别中出现不止一次'数组,我首先将值转换为小写,然后在转换为字符串之前重复数组 - 所以最终得到:

filter(forEach(value.parseJson()["categories"],v,v.toLowercase()),w,w=="chinese").uniques().join("")