使用 OpenRefine(或 R)解析大而复杂的 Json 文件的最佳方法
Best way to parse a big and intricated Json file with OpenRefine (or R)
我知道如何在 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)的解决方案对我来说也可以。
我认为您的方向是正确的。的输出:
forEach(value.parseJson().calendar_months, e, e.days)
很难阅读,因为 OpenRefine 和 JSON 都使用方括号表示数组。您从此表达式得到的是一个包含十二项的 OR 数组(一年中的每个月一项)。 OR 数组中的项目是 JSON - 每个月中的天数数组。
为了让步骤易于管理,我建议这样处理:
首次使用
forEach(value.parseJson().calendar_months,m,m.days).join("|")
您必须使用 'join',因为 OR 不能直接在单元格中存储 OR 数组 - 它必须是字符串。
然后使用 "Edit Cells->Split multi-valued cells" - 这将为每个 ID 提供 12 行,每行包含一个 JSON 表达式。现在对于每个 ID,您在 OR
中有 12 行
然后使用:
forEach(value.parseJson(),d,d).join("|")
这将 JSON 分成单独的几天
然后再次使用 "Edit Cells->Split multi-valued cells" 将每一天的详细信息拆分到自己的单元格中。
使用上面示例 URL 中的 JSON - 这为我提供了 441 行的单个 ID - 每行都包含 JSON 描述一天的可用性和价格。此时您可以在 ID 列上使用 'fill down' 函数为每一行填写 ID。
您现在在每个单元格中都有一些非常简单的 JSON - 因此您可以使用
提取可用性
value.parseJson().available
等等
而不只是将项目创建为文本,然后使用 GREL 解析...
最好的方法就是 select 您想要使用我们的 JSON 文件和 XML 文件的可视化导入向导来处理的 JSON 记录部分(您甚至可以像您的示例一样使用 URL 指向 JSON 文件)。 (这里有一个视频教程:https://www.youtube.com/watch?v=vUxdB-nl0Bw)
Select JSON 包含您要解析和使用的记录的部分(这可以是任何重复部分,只是 select 其中之一它们和 OpenRefine 将提取所有其余部分)
限制您在创建期间要加载的数据行的数量,或保留所有行的默认值。
单击“创建项目”,现在您处于“行”模式。但是,如果您认为记录模式可能更适合上下文,只需将项目再次导入为 JSON 然后 select 内容的下一个外部区域,也许是包含关键字段的更大数组,等等 在示例中,关键字段可能是日期,以及为什么我突出显示给定日期的整个记录。这样 OpenRefine 将为每条记录提供键,并且记录模式让您比行模式更好地使用它们。
随时接受这个例子,让它变得更好,甚至对所有人更有帮助,将它添加到我们在 How to Use
上的 Wiki 部分
我知道如何在 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)的解决方案对我来说也可以。
我认为您的方向是正确的。的输出:
forEach(value.parseJson().calendar_months, e, e.days)
很难阅读,因为 OpenRefine 和 JSON 都使用方括号表示数组。您从此表达式得到的是一个包含十二项的 OR 数组(一年中的每个月一项)。 OR 数组中的项目是 JSON - 每个月中的天数数组。
为了让步骤易于管理,我建议这样处理:
首次使用
forEach(value.parseJson().calendar_months,m,m.days).join("|")
您必须使用 'join',因为 OR 不能直接在单元格中存储 OR 数组 - 它必须是字符串。
然后使用 "Edit Cells->Split multi-valued cells" - 这将为每个 ID 提供 12 行,每行包含一个 JSON 表达式。现在对于每个 ID,您在 OR
中有 12 行然后使用:
forEach(value.parseJson(),d,d).join("|")
这将 JSON 分成单独的几天
然后再次使用 "Edit Cells->Split multi-valued cells" 将每一天的详细信息拆分到自己的单元格中。
使用上面示例 URL 中的 JSON - 这为我提供了 441 行的单个 ID - 每行都包含 JSON 描述一天的可用性和价格。此时您可以在 ID 列上使用 'fill down' 函数为每一行填写 ID。
您现在在每个单元格中都有一些非常简单的 JSON - 因此您可以使用
提取可用性value.parseJson().available
等等
而不只是将项目创建为文本,然后使用 GREL 解析...
最好的方法就是 select 您想要使用我们的 JSON 文件和 XML 文件的可视化导入向导来处理的 JSON 记录部分(您甚至可以像您的示例一样使用 URL 指向 JSON 文件)。 (这里有一个视频教程:https://www.youtube.com/watch?v=vUxdB-nl0Bw)
Select JSON 包含您要解析和使用的记录的部分(这可以是任何重复部分,只是 select 其中之一它们和 OpenRefine 将提取所有其余部分)
限制您在创建期间要加载的数据行的数量,或保留所有行的默认值。
单击“创建项目”,现在您处于“行”模式。但是,如果您认为记录模式可能更适合上下文,只需将项目再次导入为 JSON 然后 select 内容的下一个外部区域,也许是包含关键字段的更大数组,等等 在示例中,关键字段可能是日期,以及为什么我突出显示给定日期的整个记录。这样 OpenRefine 将为每条记录提供键,并且记录模式让您比行模式更好地使用它们。
随时接受这个例子,让它变得更好,甚至对所有人更有帮助,将它添加到我们在 How to Use
上的 Wiki 部分