如何将大型的,复杂的,深度嵌套的JSON文件展平为多个CSV文件,这是链接标识符

奥利弗·米尔斯(Oliver Mills)

我有一个复杂的JSON文件(〜8GB),其中包含企业的公开可用数据。我们已决定将文件分成多个CSV文件(或.xlsx中的选项卡),以便客户端可以轻松使用数据。这些文件将通过NZBN列/关键字链接。

我正在使用R和jsonlite读取一个小样本(在放大到整个文件之前)。我猜想我需要某种方式来指定每个文件中使用的键/列(即,第一个文件将具有标头:australianBusinessNumber,AustralianCompanyNumber,australianServiceAddress,第二个文件将具有标头:AnnualReturnFilingMonth,annualReturnLastFiled,countryOfOrigin ...)

这是两个企业/实体的示例(我也捆绑了一些数据,因此忽略实际值):测试文件

我几乎阅读了所有关于类似问题的文章,似乎都没有给我带来任何好运。我尝试了purrr,* apply命令,自定义展平函数和jqr(“ jq”的r版本-看起来很有希望,但我似乎无法运行)的变体。

这是尝试创建单独的文件的尝试,但是我不确定如何包括链接标识符(NZBN)+我一直遇到其他嵌套列表(我不确定有多少层嵌套)

bulk <- jsonlite::fromJSON("bd_test.json")

coreEntity <- data.frame(bulk$companies)
coreEntity <- coreEntity[,sapply(coreEntity, is.list)==FALSE] 

company <- bulk$companies$entity$company
company <- purrr::reduce(company, dplyr::bind_rows)

shareholding <- company$shareholding
shareholding <- purrr::reduce(shareholding, dplyr::bind_rows)

shareAllocation <- shareholding$shareAllocation
shareAllocation <- purrr::reduce(shareAllocation, dplyr::bind_rows)

我不确定在展平/整理过程中拆分文件是否更容易,还是将整个文件完全展平,这样我每个业务/实体只有一行(然后根据需要收集列)-我唯一关心的是我需要将其扩展到约130万个节点(8GB JSON文件)。

理想情况下,我希望每次有一个新集合时都将csv文件拆分,并且该集合中的值将成为新csv / tab的列。

任何帮助或提示将不胜感激。

-------更新------

由于我的问题有点模糊,所以进行了更新,我认为我只需要一些代码即可生成其中一个csv / tab,然后将其复制到其他集合中。

例如,我想创建一个包含以下元素的csv:

  • EntityName(唯一链接标识符)
  • nzbn(唯一链接标识符)
  • emailAddress__uniqueIdentifier
  • emailAddress__emailAddress
  • emailAddress__email目的
  • emailAddress__emailPurposeDescription
  • emailAddress__startDate

我该怎么办?

我不确定有多少层嵌套

这将非常有效地提供答案:

jq '
  def max(s): reduce s as $s (null; 
    if . == null then $s elif $s > . then $s else . end);
   max(paths|length)' input.json

(对于测试文件,答案为14。)

要获得数据的整体视图(模式),可以运行:

 jq 'include "schema"; schema' input.json

其中schema.jq可在此要点这将产生一个结构模式。

“例如,我想创建一个包含以下元素的csv:”

除了标题之外,这是一个jq解决方案:

.companies.entity[]
| [.entityName, .nzbn]
  + (.emailAddress[] | [.uniqueIdentifier, .emailAddress, .emailPurpose, .emailPurposeDescription, .startDate])
| @csv

持股

持股数据非常复杂,因此在下文中,我将使用to_table此页面上其他位置定义函数。

该示例数据不包含“公司名称”字段,因此在下面,我添加了一个基于0的“公司索引”字段:

  .companies.entity[]
  | [.entityName, .nzbn] as $ix
  | .company
  | range(0;length) as $cix
  | .[$cix]
  | $ix + [$cix] + (.shareholding[] | to_table(false))

q

上面的解决方案使用独立的jq可执行文件,但是一切顺利,尽管将相同的过滤器与jqr一起使用,但使用jq的过滤器应该include是最简单的,例如,显式指定路径可能最简单:

include "schema" {search: "~/.jq"};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将JSON数组展平为csv文件

如何将深度嵌套的JSON文件转换为CSV?

如何将字典的嵌套列表展平为多行?

如何将嵌套的json键/值对展平为单个值数组?

如何将嵌套的 json 展平为数据框熊猫

如何将分组的Spark RDD内容展平为单独的行然后保存到文件

尝试将JSON文件展平为CSV时出现错误消息

如何将 JSON 中的数组展平为 Pandas

如何将JSON完全展平以提取到CSV

将嵌套列表展平为1个深度列表

如何使用JSONata将嵌套对象展平为单个深度对象?

在fastq文件中,如何将序列头更改为文件名和唯一标识符?

如何将数据从嵌套的JSON文件导入CSV?

如何将大型.sav文件转换为csv文件

如何组合多个嵌套的角度展平运算符?

如何将大型JSON文件转换为Pandas Dataframe或常规CSV文件?

如何将嵌套的Java集合中的所有项目展平为单个List?

如何将嵌套的对象数组展平为数组数组?

将循环下载的文件链接到带有 bash 循环的文本列表中的标识符

如何将标识符(`proc_macro :: Ident`)存储为常量以避免重复?

Scala宏类型检查如何将标识符解析为类型?

如何将变量标识符设置为另一个变量的内容?

如何将嵌套的JSON展平到pandas数据框中

将嵌套的json解码并展平为Elm记录

如何将嵌套表展平到新行?

如何将复杂的嵌套json转换为csv

将复杂的LINQ展平为SQL

javascript-如何将json数组展平为特定json属性的数组?

c#为文件创建唯一标识符