在jq中规范化数据

时间:2017-03-03 20:36:51

标签: data-manipulation jq

想象一下类似的数据:

[{
    "names": {
        "official_full": "John Smith",
        "nickname": "Johnny"
    },
    "positions": [{
        "start": "1993-01-05",
        "end": "2002-12-03",
        "title": "Executive VP of Operations",
        "city": "Winnipeg",
        "state": "Michigan"
    }, ...]
}, ...]

是否可以在jq中对数据进行标准化,如下所示?

{
    people: [{
        "full_name": "John Smith"
    }, ...],

    terms: [{
        "start": "1993-01-05",
        "end": "2002-12-03",
        "person": 1,
        "job": 0
    }, ...],

    jobs: [{
        "title": "Executive VP of Operations",
        "location": 0
    }, ...],

    locations: [{
        "city": "Winnipeg",
        "state": "Michigan"
    }, ...]
}

我是jq的新手,所以我不知道从哪里开始。我的主要问题是如何预先创建一个对象,然后在迭代传入的json时填充该对象,即

{
    people: [],
    terms: [],
    jobs: [],
    locations: []
}

如何获取附加对象的索引?

我不确定这对jq来说是否容易。我可能只是使用normalizrjs编写一个nodejs脚本。

另一个问题是确保joblocation之类的对象不会重复,因此我要确保没有重复的对象领域。我觉得这可能不是那么难。我只需要在插入对象之前将对象与数组中的对象进行比较

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您应该能够使用reduce按照以下方式完成您想要的任务:

reduce .[] as $o
  ({
     people: [],
     terms: [],
     jobs: [],
     locations: []
   }; ......
 )

请参阅有关reduce的jq文档,但简而言之,您将使用jq指令替换......以构建规范化表示。

检查重复项的最简单方法可能是使用index/1。我建议使用辅助函数(def ...)来保持易读性和易于维护。

数字ID

如果你需要生成一个数字id,那么使用这个成语可能更容易:

. as $in | reduce range(0;length) as $i (INITIAL; $in[$i] as $o | ......)