gpt4 book ai didi

json - 在 powershell 中遍历巨大的 JSON

转载 作者:行者123 更新时间:2023-12-05 05:07:07 25 4
gpt4 key购买 nike

我有一个 19 GB 的 JSON 文件。一大堆相当小的物体。

[{
"name":"Joe Blow",
"address":"Gotham, CA"
"log": [{},{},{}]
},
...
]

我想遍历这个 JSON 的根数组。每个带有日志的对象占用的内存不超过 2MB。可以将一个对象加载到内存中,使用它并丢弃它。

然而,文件本身有 19 个演出。它有数百万个这样的对象。我发现可以使用 C# 和 Newtonsoft.Json 库遍历这样的数组。您只需在流中读取一个文件,一旦看到完成的对象,就将其序列化并吐出。

但我想看看powershell是否也能做到这一点?不要将整个内容作为一个 block 来阅读,而是迭代你现在在料斗中的内容。

有什么想法吗?

最佳答案

据我所知,convertfrom-json 没有流模式,但 jq 有:Processing huge json-array files with jq .这段代码将把一个巨大的数组变成数组的内容,可以逐段输出。否则,一个 6mb、400000 行的 json 文件在转换后可以使用 1 gig 的内存(在 powershell 7 中为 400 megs)。

get-content file.json | 
jq -cn --stream 'fromstream(1|truncate_stream(inputs))' |
% { $_ | convertfrom-json }

例如:

[
{"name":"joe"},
{"name":"john"}
]

变成这样:

{"name":"joe"}
{"name":"john"}

jq的流格式看起来和json很不一样。例如,数组看起来像这样,带有每个值和对象或数组结束标记的路径。

'[{"name":"joe"},{"name":"john"}]' | jq --stream -c

[[0,"name"],"joe"]
[[0,"name"]] # end object
[[1,"name"],"john"]
[[1,"name"]] # end object
[[1]] # end array

然后在两个值的路径中截断“1”“父文件夹”后:

'[{"name":"joe"},{"name":"john"}]' | jq -cn --stream '1|truncate_stream(inputs)'     

[["name"],"joe"]
[["name"]] # end object
[["name"],"john"]
[["name"]] # end object
# no more end array

"fromstream()"将其转回 json...

'[{"name":"joe"},{"name":"john"}]' | jq -cn --stream 'fromstream(1|truncate_stream(inputs))'  

{"name":"joe"}
{"name":"john"}

关于json - 在 powershell 中遍历巨大的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59403294/

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