我有一个很大的JSON文件,我猜有400万个对象。每个顶层都有几个嵌套的层次。我想把它分成多个文件,每个文件有10000个顶层对象(保留每个文件的结构)。jq应该能做到这一点吧?我不知道怎么做。
所以数据是这样的:
[{
"id": 1,
"user": {
"name": "Nichols Cockle",
"email": "ncockle0@tmall.com",
"address": {
"city": "Turt",
"state": "Thị Trấn Yên Phú"
}
},
"product": {
"name": "Lychee - Canned",
"code": "36987-1526"
}
}, {
"id": 2,
"user": {
"name": "Isacco Scrancher",
"email": "iscrancher1@aol.com",
"address": {
"city": "Likwatang Timur",
"state": "Biharamulo"
}
},
"product": {
"name": "Beer - Original Organic Lager",
"code": "47993-200"
}
}, {
"id": 3,
"user": {
"name": "Elga Sikora",
"email": "esikora2@statcounter.com",
"address": {
"city": "Wenheng",
"state": "Piedra del Águila"
}
},
"product": {
"name": "Parsley - Dried",
"code": "36987-1632"
}
}, {
"id": 4,
"user": {
"name": "Andria Keatch",
"email": "akeatch3@salon.com",
"address": {
"city": "Arras",
"state": "Iracemápolis"
}
},
"product": {
"name": "Wine - Segura Viudas Aria Brut",
"code": "51079-385"
}
}, {
"id": 5,
"user": {
"name": "Dara Sprowle",
"email": "dsprowle4@slate.com",
"address": {
"city": "Huatai",
"state": "Kaduna"
}
},
"product": {
"name": "Pork - Hock And Feet Attached",
"code": "0054-8648"
}
}]
如果这是一个完整的对象:
{
"id": 1,
"user": {
"name": "Nichols Cockle",
"email": "ncockle0@tmall.com",
"address": {
"city": "Turt",
"state": "Thị Trấn Yên Phú"
}
},
"product": {
"name": "Lychee - Canned",
"code": "36987-1526"
}
}
每个文件都是指定数量的对象。
2条答案
按热度按时间ogq8wdun1#
[EDIT:本答复已根据问题的修订内容进行了修订。]
使用jq解决这个问题的关键是
-c
命令行选项,它生成JSON行格式的输出(即,在本例中,每行一个对象),然后可以使用awk
或split
之类的工具将这些行分发到多个文件中。如果文件不是太大,那么最简单的方法是使用以下内容启动管道:
如果文件太大,内存中放不下,那么可以使用jq的流解析器,如下所示:
或者,您可以使用命令行工具,如jstream或jm,这将是更快的,但当然必须安装。
有关jq的流解析器的进一步讨论,请参见jq常见问题解答中的相关章节:https://github.com/stedolan/jq/wiki/FAQ#streaming-json-parser
分区
有关对第一步中生成的输出进行分区的不同方法,请参见例如How can I split a large text file into smaller files with an equal number of lines?
如果要求每个输出文件都是一个对象数组,那么我可能会使用
awk
在一个步骤中执行分区和重构,但还有许多其他合理的方法。如果输入是JSON对象序列
作为参考,如果原始文件由JSON对象的流或序列组成,则适当的调用应为:
以这种方式使用
inputs
允许有效地处理任意多个对象。6jygbczu2#
可以使用
jq
对json文件或流进行切片。请参见下面的脚本。sliceSize
参数设置切片的大小,并确定同时在内存中保存多少个输入。这允许控制内存使用。要切片的输入
输入不必格式化。
输入可能:
切片输出
可以使用格式化或压缩Json创建文件
切片输出文件可以包含:
性能
一个快速基准测试显示了切片过程中的时间和内存消耗(在我的笔记本电脑上测量)
包含100.000个json对象的文件,46 MB
包含1.000.000个json对象的文件,450 MB
脚本输出
生成的文件
array_of_json_inputs_sliced_1.json
array_of_json_inputs_sliced_2.json
array_of_json_inputs_sliced_3.json