我知道如何在Open refine中解析json单元格,但这对我来说太棘手了。
我使用API来提取4730 AirBNB房间的日历,这些房间由他们的ID标识。
对于每个ID以及从现在起到2017年11月的一年中的每一天,我想提取这个房间的可用性(真或假)及其当天的价格。
我无法弄清楚如何解析这些信息。我想这意味着一系列嵌套的forEach,但我无法通过Open Refine找到正确的方法。
我当然试过了
forEach(value.parseJson().calendar_months, e, e.days)
结果是一系列字典数组扰乱了我。
任何帮助都会受到赞赏。如果在Open Refine中操作太难,那么使用R(或Python)的解决方案对我来说也没问题。
答案 0 :(得分:2)
而不是仅仅将项目创建为文本,并使用GREL解析...
最好的方法是使用我们的可视导入器向导为JSON文件和XML文件选择要使用的JSON记录部件(您甚至可以使用指向JSON文件的URL,如示例所示)。 (视频教程显示了这里:https://www.youtube.com/watch?v=vUxdB-nl0Bw)
选择包含您要解析和使用的记录的JSON部分(这可以是任何重复部分,只需选择其中一个,OpenRefine将提取所有其余部分)
单击“创建项目”,然后单击“行”模式。但是,如果您认为记录模式可能更适合上下文,则只需再次将项目作为JSON导入,然后选择内容的下一个外部区域,可能是包含键字段的较大数组等。在示例中,键字段可能是日期,为什么我突出显示给定日期的整个记录。这样,OpenRefine将为每条记录提供密钥,而记录模式可让您比行模式更好地使用它们。
随意采取这个例子,让它变得更好,对所有人更有帮助,将它添加到How to Use上的Wiki部分
答案 1 :(得分:1)
我认为你走在正确的轨道上。输出:
forEach(value.parseJson().calendar_months, e, e.days)
很难阅读,因为OpenRefine和JSON都使用方括号来表示数组。你从这个表达式得到的是一个包含12个项目的OR数组(一年中每个月一个)。 OR数组中的项目是JSON - 每个项目都是一个月中的天数。
为了保持步骤易于管理,我建议像这样处理:
首次使用
forEach(value.parseJson().calendar_months,m,m.days).join("|")
你必须使用'join',因为OR不能直接在单元格中存储OR数组 - 它必须是一个字符串。
然后使用“编辑单元格 - >分割多值单元格” - 这将为每个ID提供12行,每个包含一个JSON表达式。现在,对于每个ID,您在OR中有12行
然后使用:
forEach(value.parseJson(),d,d).join("|")
这会将JSON拆分为单独的日期
然后再次使用“编辑单元格 - >拆分多值单元格”将每天的详细信息拆分到自己的单元格中。
使用上面示例网址中的JSON - 这为单个ID提供了441行 - 每行包含描述可用性的JSON和&单日价格。此时,您可以使用ID列上的“填充”功能填写每行的ID。
现在,您已经在每个单元格中获得了一些非常简单的JSON - 因此您可以使用
提取可用性value.parseJson().available
等