如何在新的 OpenRefine 列中仅保存特定的 JSON 元素
How to save only specific JSON elements in a new OpenRefine column
{
"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'
作为唯一值并删除任何其他值?
在上面的例子中,GREL 表达式:
value.parseJson()['categories']
生成包含两个值的数组:
["Chinese", "Restaurants"]
您可以使用作用于数组的 GREL 表达式来操作它。例如,要 select 数组中的第一个值,您可以使用:
value.parseJson()['categories'][0]
这将 select 数组中的第一个条目(将表达式末尾方括号中的数字增加到 select 数组中的其他条目)
如果您想过滤数组中的特定值,您可以使用 'filter' 表达式:
filter(value.parseJson()['categories'],v,v=="Chinese")
这将生成一个新数组,其中只有单词 "Chinese"(在上例中)。要将其存储在新列中,您需要将数组转换为字符串:
filter(value.parseJson()['categories'],v,v=="Chinese").join("")
为了避免区分大小写的问题,以及 'Chinese' 在 'categories' 数组中出现不止一次的可能性,我会先将值转换为小写并删除重复数组在转换为字符串之前 - 所以你最终得到:
filter(forEach(value.parseJson()["categories"],v,v.toLowercase()),w,w=="chinese").uniques().join("")
{
"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'
作为唯一值并删除任何其他值?
在上面的例子中,GREL 表达式:
value.parseJson()['categories']
生成包含两个值的数组:
["Chinese", "Restaurants"]
您可以使用作用于数组的 GREL 表达式来操作它。例如,要 select 数组中的第一个值,您可以使用:
value.parseJson()['categories'][0]
这将 select 数组中的第一个条目(将表达式末尾方括号中的数字增加到 select 数组中的其他条目)
如果您想过滤数组中的特定值,您可以使用 'filter' 表达式:
filter(value.parseJson()['categories'],v,v=="Chinese")
这将生成一个新数组,其中只有单词 "Chinese"(在上例中)。要将其存储在新列中,您需要将数组转换为字符串:
filter(value.parseJson()['categories'],v,v=="Chinese").join("")
为了避免区分大小写的问题,以及 'Chinese' 在 'categories' 数组中出现不止一次的可能性,我会先将值转换为小写并删除重复数组在转换为字符串之前 - 所以你最终得到:
filter(forEach(value.parseJson()["categories"],v,v.toLowercase()),w,w=="chinese").uniques().join("")