将JSON数组拆分为单独的文件/对象

问题描述 投票:4回答:4

我以这种格式从Cassandra导出JSON。

[
  {
    "correlationId": "2232845a8556cd3219e46ab8",
    "leg": 0,
    "tag": "received",
    "offset": 263128,
    "len": 30,
    "prev": {
      "page": {
        "file": 0,
        "page": 0
      },
      "record": 0
    },
    "data": "HEAD /healthcheck HTTP/1.1\r\n\r\n"
  },
  {
    "correlationId": "2232845a8556cd3219e46ab8",
    "leg": 0,
    "tag": "sent",
    "offset": 262971,
    "len": 157,
    "prev": {
      "page": {
        "file": 10330,
        "page": 6
      },
      "record": 1271
    },
    "data": "HTTP/1.1 200 OK\r\nDate: Wed, 14 Feb 2018 12:57:06 GMT\r\nServer: \r\nConnection: close\r\nX-CorrelationID: Id-2232845a8556cd3219e46ab8 0\r\nContent-Type: text/xml\r\n\r\n"
  }]

我想将其拆分为单独的文件:

{“correlationId”:“2232845a8556cd3219e46ab8”,“leg”:0,“tag”:“received”,“offset”:263128,“len”:30,“prev”:{“page”:{“file”:0 ,“page”:0},“record”:0},“data”:“HEAD / healthcheck HTTP / 1.1 \ r \ n \ r \ n”}}

{“correlationId”:“2232845a8556cd3219e46ab8”,“leg”:0,“tag”:“sent”,“offset”:262971,“len”:157,“prev”:{“page”:{“file”:10330 ,“page”:6},“record”:1271},“data”:“HTTP / 1.1 200 OK \ r \ n日期:星期三,2018年2月14日12:57:06 GMT \ r \ n服务器:\ r \ n \ n \ nConnection :close \ r \ n-CorrelationID:Id-2232845a8556cd3219e46ab8 0 \ r \ nContent-Type:text / xml \ r \ n \ r \ n“}

我想使用jq,但没有找到方法。

你能告诉方法,如何通过文件分隔符拆分它?

谢谢,雷迪

json posix jq multiple-files
4个回答
1
投票

使用jq,可以使用过滤器将数组拆分为其组件:

.[]

那么问题就变成了每个组件要做的事情。如果要将每个组件定向到单独的文件,您可以(例如)将jq与-c选项一起使用,并将结果过滤为awk,然后awk可以将组件分配给不同的文件。参见例如Split JSON File Objects Into Multiple Files

Performance considerations

有人可能认为调用jq + awk的开销与调用python相比会很高,但是与python + json相比,jq和awk都是轻量级的,正如这些时序所建议的那样(使用Python 2.7.10):

time (jq -c  .[] input.json | awk '{print > "doc00" NR ".json";}')
user    0m0.005s
sys     0m0.008s

time python split.py
user    0m0.016s
sys     0m0.046s

2
投票

如果你有一个包含2个对象的数组:

jq '.[0]' input.json > doc1.json && jq '.[1]' input.json > doc2.json

结果:

$ head -n100 doc[12].json
==> doc1.json <==
{
  "correlationId": "2232845a8556cd3219e46ab8",
  "leg": 0,
  "tag": "received",
  "offset": 263128,
  "len": 30,
  "prev": {
    "page": {
      "file": 0,
      "page": 0
    },
    "record": 0
  },
  "data": "HEAD /healthcheck HTTP/1.1\r\n\r\n"
}

==> doc2.json <==
{
  "correlationId": "2232845a8556cd3219e46ab8",
  "leg": 0,
  "tag": "sent",
  "offset": 262971,
  "len": 157,
  "prev": {
    "page": {
      "file": 10330,
      "page": 6
    },
    "record": 1271
  },
  "data": "HTTP/1.1 200 OK\r\nDate: Wed, 14 Feb 2018 12:57:06 GMT\r\nServer: \r\nConnection: close\r\nX-CorrelationID: Id-2232845a8556cd3219e46ab8 0\r\nContent-Type: text/xml\r\n\r\n"
}

2
投票

您可以使用Python更有效地执行此操作(因为您可以读取整个输入一次,而不是每个文档读取一次):

import json

docs = json.load(open('in.json'))

for ii, doc in enumerate(docs):
    with open('doc{}.json'.format(ii), 'w') as out:
        json.dump(doc, out, indent=2)

2
投票

要将具有许多记录的json拆分成所需大小的块,我只需使用:

jq -c '.[0:1000]' mybig.json

它像python切片一样工作。

请参阅此处的文档:https://stedolan.github.io/jq/manual/

数组/字符串切片:。[10:15]

。[10:15]语法可用于返回字符串的子数组或字符串的子字符串。由。[10:15]返回的数组的长度为5,包含索引10(包括)到索引15(不包括)的元素。索引可以是负数(在这种情况下,它从数组的末尾向后计数),或者省略(在这种情况下,它指的是数组的开头或结尾)。

© www.soinside.com 2019 - 2024. All rights reserved.