我有一个复杂的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:
我该怎么办?
我不确定有多少层嵌套
这将非常有效地提供答案:
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可在此要点。这将产生一个结构模式。
除了标题之外,这是一个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))
上面的解决方案使用独立的jq可执行文件,但是一切顺利,尽管将相同的过滤器与jqr一起使用,但使用jq的过滤器应该include
是最简单的,例如,显式指定路径可能最简单:
include "schema" {search: "~/.jq"};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句