如何使用jq创建一个基于对象的列,并将同一数组中的其他对象列在它下面,以便json转换为csv?

问题描述 投票:0回答:1

你好,社区。

我是jq的新手,我想用它作为一个工具,将json输出隐藏到csv中。

我有以下的情况。 我想把下面列出的json数据隐蔽到一个格式很好的csv文件中,以便在json所能提供的格式之外进行其他编辑和审计过程。

我有以下的json数据。

{
"enrollments": [
    {
        "adminContact": {
            "email": "[email protected]",
            "firstName": "john",
            "lastName": "doe",
            "phone": "555-555-5555"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "example1.com",
                "example2.com",
                "example3.com",
                "example4.com"
            ],
            "st": "Bermingham"
        }
    },
    {
        "adminContact": {
            "email": "[email protected]",
            "firstName": "john",
            "lastName": "doe",
            "phone": "555-555-5555"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column2.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "www.example1.com",
                "www.example2.com",
                "www.example3.com",
                "www.example4.com"
            ],
            "st": "Bermingham"
        },
        "certificateType": "third-party",
        "changeManagement": true,
        "csr": {
            "c": "US",
            "cn": "www.column-other-additional-iterations.com",
            "l": "Houston",
            "o": "A Company International Ltd.",
            "ou": "Technology and Operations Services",
            "sans": [
                "www.example-to-infinite1.com",
                "www.example-to-infinite2.com",
                "www.example-to-infinite3.com",
                "www.example-to-infinite4.com"
            ],
            "st": "Bermingham"
    }
]
}

我的目标是把它覆盖到一个格式如下的csv文件中。 我希望能够抓取 "cn "和它们对应的 "SAN "的任何出现,分别对其进行迭代并创建它们各自的列。

Common Name      SANS            Common Name      SANS             => iterate
www.column.com   example1.com    www.column2.com  www.example1.com
                 example2.com                     www.example2.com
                 example3.com                     www.example3.com
                 example4.com                     www.example4.com  

到目前为止,我所能做的是:

jq -r '.enrollments[].csr | {cn: .cn, sans: .sans[]}  | [.cn, .sans] |@csv' certs.json > test.csv

它给我的输出结果如下:

"www.column.com","example1.com"
"www.column.com","example2.com"
"www.column.com","example3.com"
"www.column.com","example4.com"
"www.column2.com","www.example1.com"
"www.column2.com","www.example2.com"
"www.column2.com","www.example3.com"
"www.column2.com","www.example4.com"
...iterate through all records of the same type of data that occurs

所以,我能够将 "cn "对象连接到 "sans "数组中。

如果我上面列举的所需格式不可能实现,那么下面的输出是否可行?

Common Name      SANS
www.column.com   example1.com
www.column.com   example2.com
www.column.com   example3.com
www.column.com   example4.com
www.column2.com  www.example1.com
www.column2.com  www.example2.com
www.column2.com  www.example3.com
www.column2.com  www.example4.com
...iterate through all records of the same type of data that occurs

当我在网上研究的时候,我遇到了一些别人正在使用的技术,但我还没有能够找到一个解决方案。

对于列名,我一直在命令中玩弄这个。然而,我所做的一切尝试似乎都没有用。

(["Common Name"] + ["SANS"]),

另外,很多帖子都说要用地图功能,

jq --raw-output '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

但我得到了以下输出。

jq: error (at <stdin>:51): object ({"adminCont...) is not valid in a csv row
0,1

exit status 5

看起来像是卡在了第一个对象上 我不确定"{"是否是编程出错的地方 但我尝试了下面的方法: 我试着用不同的路径替换"^"所在的区域,希望让程序找到我要找的东西。

jq --raw-output '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | 
                      ^                                    ^                            ^
$cols, $rows[] | @csv'

我试着用下面的路径来代替它,分别是:

.enrollments[].csr
.csr.cn
.csr.sans

在这一点上,我不确定,决定向社区求助。 同样,我是jq新手,我试图在这里找到联系,关系,学习逻辑。 我愿意接受任何建议、意见,或者是否有更好的方式来捕捉这些信息。我也对其他方法或最佳实践持开放态度,可以用其他格式输出来代替。

如果已经有类似的帖子存在,我提前表示歉意,因为我无法在搜索中找到它。 如果是这样,请告诉我,我将按照社区指南来编辑或删除这个帖子。

非常感谢您的帮助。 谢谢您的帮助

json csv multiple-columns jq
1个回答
1
投票

所要求的格式在几个方面有点奇怪,所以让我们从一个更简单,也许更有用的目标开始--产生一个更规则的格式。

www.column.com  example1.com    www.column2.com www.example1.com
www.column.com  example2.com    www.column2.com www.example2.com
www.column.com  example3.com    www.column2.com www.example3.com
www.column.com  example4.com    www.column2.com www.example4.com

这可以通过过滤器来实现

[ [.enrollments[0].csr |  {cn, sans: .sans[]} | [.cn, .sans] ],
  [.enrollments[1].csr |  {cn, sans: .sans[]} | [.cn, .sans] ] ]
| transpose
| map(add)
| .[]
| @csv

除了第一行之外,第一和第三列都要抹去。

现在通过调整上面的jq程序,使其成为,就可以很容易地得到所要求的格式。

[ [.enrollments[0].csr |  {cn, sans: .sans[]} | [.cn, .sans] ],
  [.enrollments[1].csr |  {cn, sans: .sans[]} | [.cn, .sans] ] ]
| transpose
| map(add)
| (.[0],
   (.[1:][] | (.[2] = "" | .[0] = "" )))
| @csv

通用方法

上面的第一个程序可以被概括为允许 "注册 "数组任意长,如下所示。

[ .enrollments[]
  | [ .csr |  {cn, sans: .sans[]} | [.cn, .sans] ]]
| transpose
| map(add)
| .[]
| @tsv

这也可以像以前一样修改,以使除第一行以外的所有数值都是空白的。

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