Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jq如何将一个非常大的JSON文件拆分为多个文件,每个文件都有特定数量的对象?_Json_Jq_Data Partitioning - Fatal编程技术网

使用jq如何将一个非常大的JSON文件拆分为多个文件,每个文件都有特定数量的对象?

使用jq如何将一个非常大的JSON文件拆分为多个文件,每个文件都有特定数量的对象?,json,jq,data-partitioning,Json,Jq,Data Partitioning,我有一个很大的JSON文件,估计有400万个对象。每个顶层都有几个嵌套的层。我想将其拆分为多个文件,每个文件包含10000个顶级对象(每个文件中保留结构)。jq应该能够做到这一点,对吗?我不知道怎么做 所以像这样的数据: [{ "id": 1, "user": { "name": "Nichols Cockle", "email": "ncockle0@tmall.com", "address": { "city": "Turt", "st

我有一个很大的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"
  }
}

每个文件都是指定数量的类似对象。

[编辑:此答案已根据对问题的修订进行了修订。]

使用jq解决问题的关键是
-c
命令行选项,它以JSON行格式生成输出(即,在本例中,每行一个对象)。然后,您可以使用
awk
split
等工具将这些行分布到多个文件中

如果文件不太大,则最简单的方法是启动管道:

jq -c '.[]' INPUTFILE
如果文件太大,无法轻松放入内存,则可以使用jq的流式解析器,如下所示:

jq -cn --stream 'fromstream(1|truncate_stream(inputs))'
有关流式解析器的进一步讨论,请参见jq常见问题解答中的相关章节:

分割 有关对第一步中生成的输出进行分区的不同方法,请参见示例

如果要求每个输出文件都是一个对象数组,那么我可能会使用
awk
在一个步骤中执行分区和重新构造,但是还有许多其他合理的方法

如果输入是JSON对象序列 作为参考,如果原始文件由JSON对象流或序列组成,则适当的调用为:

jq -n -c inputs INPUTFILE

以这种方式使用
输入
可以有效地处理任意多个对象。

能否更具体地说明文件的结构?文件的顶层对象是数组吗?文件是否足够小,可以放入RAM中(即,如果您将其输入命令
jq.
它是否崩溃或工作?@hobbs编辑以添加示例)。是的,整个文件基本上是一个巨大的对象数组。它没有使它崩溃,但它正在挣扎,只是
谢谢,但我想我遗漏了一些东西-
jq-n-c INPUTFILE
将所有内容放在一行上。是因为整个文件是一个巨大的数组吗?好的,我添加了
[]
并取得了进展!现在,我只需要将分割的输出返回到一个数组中……感谢@peak给出的伟大答案!我使用过这种方法,但遇到了一些性能问题。如果你有什么想法,这是我的亲戚。