r - 如何将一个大型、复杂、深度嵌套的 JSON 文件扁平化为多个 CSV 文件(链接标识符)

标签 r json csv jq jsonlite

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

我正在使用 R 和 jsonlite 读取一个小样本(在扩展到完整文件之前)。我猜我需要某种方法来指定每个文件中的键/列(即,第一个文件将具有标题:australianBusinessNumber、australianCompanyNumber、australianServiceAddress,第二个文件将具有标题:annualReturnFilingMonth、annualReturnLastFiled、countryOfOrigin ...)

这是两个企业/实体的示例(我也破坏了一些数据,因此忽略实际值):test file

我几乎阅读了 s/o 上类似问题的所有帖子,但似乎没有一个给我带来任何运气。我尝试过 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/选项卡的列。

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

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

更新,因为我的问题有点模糊,我认为我需要的只是一些代码来生成其中一个 csv/选项卡,然后我为其他集合复制。

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

  • entityName(唯一链接标识符)
  • nzbn(唯一链接 标识符)
  • 电子邮件地址__uniqueIdentifier
  • 电子邮件地址__电子邮件地址
  • 电子邮件地址__emailPurpose
  • emailAddress__emailPurposeDescription
  • 电子邮件地址__startDate

我该怎么做?

最佳答案

i'm unsure how many levels of nesting there are

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

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。)

要获得数据的整体 View (架构),您可以 运行:

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

其中 schema.jq 可以在此 gist 获得。这将产生一个结构模式。

“例如,我想创建以下元素的 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))

jqr

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

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

关于r - 如何将一个大型、复杂、深度嵌套的 JSON 文件扁平化为多个 CSV 文件(链接标识符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890557/

相关文章:

R lubridate 包日期时间创建省略了午夜时间

r - 使用 ggplot2 表示散点图中每个点的小饼图

javascript - 如何解决 javascript 中 JSON 中的意外标记 { 语法错误

python - KO : Error when parsing JSON

python - python 中的输出按字典排序

r - devtools/GitHub 下载错误

r - fiddle 情节 : description for a paper

json - NIFI :Json Content Parsing in FlowFile

parsing - 有趣的 CSV 格式帮助

python - 使用pandas进行回归,报错: cannot concatenate 'str' and 'float' objects