咨询:OpenRefine中提取单元格JSON值及name字段的GREL表达式
解决OpenRefine中提取JSON数组里"name"值的问题
嘿,作为OpenRefine和GREL的新手,碰到这种单元格里混着文本和JSON数组的情况确实容易头大,我来给你一步步拆解解决方案!
核心GREL表达式
直接用下面这个表达式就能完美处理你给出的所有示例,把所有"name"值提取出来并拼接成整齐的字符串:
forEach(parseJson(value.replace(/'/g, '"')), x, x.name).join(', ')
表达式逐部分解释
让我帮你拆解每个部分的作用,方便你理解和灵活调整:
value.replace(/'/g, '"'):你的示例里用的是单引号,但标准JSON要求双引号,这一步先把所有单引号替换成双引号,保证后续能正确解析parseJson(...):把处理后的字符串转换成OpenRefine可以识别的JSON数组对象forEach(..., x, x.name):遍历JSON数组里的每一个对象,提取每个对象的"name"属性值,得到一个只包含name的列表.join(', '):把列表里的所有name值用「逗号+空格」连接成一个可读性强的字符串
验证你的示例输入
用上面的表达式测试你的示例,结果完全符合预期:
- 输入:
[{'name': 'Pixar Animation Studios', 'id': 3}]→ 输出:Pixar Animation Studios - 输入:
[{'name': 'TriStar Pictures', 'id': 559}, {'name': 'Teitler Film', 'id': 2550}, {'name': 'Interscope Communications', 'id': 10201}]→ 输出:TriStar Pictures, Teitler Film, Interscope Communications - 输入:
[{'name': 'Twentieth Century Fox Film Corporation', 'id': 306}]→ 输出:Twentieth Century Fox Film Corporation - 输入:
[{'iso_3166_1': 'US', 'name': 'United States of America'}]→ 输出:United States of America
额外优化:处理非JSON内容
如果你的CSV里还有纯文本单元格(没有JSON数组),可以加个判断避免报错,保留原内容:
if(isJson(value.replace(/'/g, '"')), forEach(parseJson(value.replace(/'/g, '"')), x, x.name).join(', '), value)
OpenRefine中提取JSON值的通用方法
总结一下在OpenRefine里处理JSON的通用GREL技巧:
- 标准化JSON格式:确保字符串符合标准JSON语法(比如双引号、正确的括号匹配),如果是单引号就用
replace(/'/g, '"')替换 - 解析JSON:用
parseJson(jsonString)把字符串转为JSON对象或数组 - 提取值:
- 如果是单个JSON对象,直接用
.keyName提取,比如parseJson(cleanedString).name - 如果是JSON数组,用
forEach(array, item, item.keyName)遍历提取每个元素的指定键值,再按需拼接
- 如果是单个JSON对象,直接用
内容的提问来源于stack exchange,提问作者aaronrose05
相关产品推荐
相关产品推荐

