gpt4 book ai didi

json - jq:展平具有不必要嵌套级别的对象

转载 作者:可可西里 更新时间:2023-11-01 09:34:10 25 4
gpt4 key购买 nike

我正面临一个 json 文件的问题,其中相同的键有时有一个固定值,而其他键有一个额外的嵌套(对于我的目的来说是不必要的)级别,然后包含相关值。

该文件是换行符分隔的,我正试图摆脱任何额外的层次。到目前为止,只有当嵌套级别出现在树的第一个分支中时,我才设法做到这一点,使用

jq -c '[.] | map(.[] |= if type == "object" and (.number | length) > 0 then .numberLong else . end) | .[]' mongoDB.json

下面的例子进一步说明了这一点。我最初拥有的是:

  {
"name": "John",
"age": {
"numberLong": 22
}
}
{
"name": "Jane",
"age": 24
}
{
"name": "Dennis",
"age": 34,
"details": [
{
"telephone_number": 555124124
}
]
}
{
"name": "Frances",
"details": [
{
"telephone_number": {
"numberLong": 444245523
}
}
]
}

我的脚本做了什么(第二个 numberLong 被忽略):

  {
"name": "John",
"age": 22
},
{
"name": "Jane",
"age": 24
}
{
"name": "Dennis",
"age": 34,
"details": [
{
"telephone_number": 555124124
}
]
}
{
"name": "Frances",
"details": [
{
"telephone_number": {
"numberLong": 444245523
}
}
]
}

我实际上希望实现的目标(递归复制所有 numberLong 键的值向上一级,无论它们属于文件中的什么位置):

[
{
"name": "John",
"age": 22
},
{
"name": "Jane",
"age": 24
},
{
"name": "Dennis",
"age": 34,
"details": [
{
"telephone_number": 555124124
}
]
},
{
"name": "Frances",
"details": [
{
"telephone_number": 444245523
}
]
}
]

此转换是日常管道的一部分,适用于大小高达 70GB 的多个文件,因此遍历文件时的速度可能会成为一个问题。问题源于 MongoDB 的不同类型:MongoDB differences between NumberLong and simple Integer?

谢谢!

最佳答案

如果您的 jq 具有“walk/1”,那么最简单的完全通用的解决方案将遵循以下原则:

walk( if type=="object"
then with_entries( if .value | (type == "object" and has("numberLong"))
then .value |= .numberLong
else . end)
else . end )

如果你的jq没有walk,那最好升级,这样也能提高速度;否则你可以在 jq 中搜索它的 def。

如果这对于您的非常大的文件来说太慢了,您可能必须追踪需要转换的精确位置以避免完全通用方法的开销。

处理超大文件的注意事项

您的示例(“我最初拥有的”)给出了一个对象流,因此可能值得指出的是,由于 jq 是面向流的,因此处理由 JSON 实体流组成的非常大的文件没有问题(又名“文档”),单个不是那么大。

(一个近似的经验法则是,如果输入中最大的 JSON 实体大小为 N 个单位,并且如果 jq 创建的最大 JSON 实体大小为 M 个单位,那么 jq 可能需要访问大约 M + N + max (M,N) 个内存单元。)

要处理包含单个 JSON 数组的非常大的文件,建议首先生成顶级元素流以供后续处理。

在最坏的情况下(一个非常大的文件和一个非常大、复杂的 JSON 文档),您可能必须使用流式解析器,例如 jq 拥有的解析器。

有关处理超大文件的各种技术的说明,请参阅 Process huge GEOJson file with jq

关于json - jq:展平具有不必要嵌套级别的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com