You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询: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技巧:

  1. 标准化JSON格式:确保字符串符合标准JSON语法(比如双引号、正确的括号匹配),如果是单引号就用replace(/'/g, '"')替换
  2. 解析JSON:用parseJson(jsonString)把字符串转为JSON对象或数组
  3. 提取值:
    • 如果是单个JSON对象,直接用.keyName提取,比如parseJson(cleanedString).name
    • 如果是JSON数组,用forEach(array, item, item.keyName)遍历提取每个元素的指定键值,再按需拼接

内容的提问来源于stack exchange,提问作者aaronrose05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:32:52