我有一个复杂的 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/