作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!