繁体   English   中英

使用 jq 遍历 JSON 并转换为 CSV

[英]Iterating over JSON using jq and convert to CSV

我有以下 JSON 有效负载,我想使用jq将其展平,然后转换为 CSV。

我遇到的问题是我不确定如何处理booksmoviesdvds arrays,因为它们的结果数量不同。

{
  "report": {

    "clients": [
      {
        "id": "001",
        "name": "client_1",

        "books": [
          {"sku": "100", "description": "book title: book-A"},
          {"sku": "101", "description": "book title: book-B"},
          {"sku": "102", "description": "book title: book-C"}
        ],

        "movies": [
          {"sku": "200", "description": "movie title: movie-A"},
          {"sku": "201", "description": "movie title: movie-B"}
        ],

        "dvds": [
          {"sku": "300", "description": "dvd title: dvd-A"}
        ]
      },

      {
        "id": "002",
        "name": "client_2",

        "books": [
          {"sku": "100", "description": "book title: book-A"},
          {"sku": "101", "description": "book title: book-B"},
          {"sku": "102", "description": "book title: book-C"},
          {"sku": "103", "description": "book title: book-D"},
          {"sku": "104", "description": "book title: book-E"}
        ],

        "movies": [
          {"sku": "200", "description": "movie title: movie-A"}

        ],

        "dvds": [
          {"sku": "300", "description": "dvd title: dvd-A"},
          {"sku": "301", "description": "dvd title: dvd-B"},
          {"sku": "302", "description": "dvd title: dvd-C"},
          {"sku": "303", "description": "dvd title: dvd-D"}
        ]
      }

    ]
  }
}

对于客户拥有的每bookmoviedvd ,我需要引用客户 ID 和名称。 下面是我想要实现的 output 的表示:

c_id      | c_name   | type   | sku | description            |
----------|----------|--------|-----|------------------------|
001       | client_1 | books  | 100 | book title: book-A     |
001       | client_1 | books  | 101 | book title: book-B     |
001       | client_1 | books  | 102 | book title: book-C     |
001       | client_1 | movies | 200 | movie title: movie-A   |
001       | client_1 | movies | 201 | movie title: movie-B   |
001       | client_1 | dvds   | 300 | dvd title: dvd-A       |
002       | client_2 | books  | 100 | book title: book-A     |
002       | client_2 | books  | 101 | book title: book-B     |
002       | client_2 | books  | 102 | book title: book-C     |
002       | client_2 | books  | 103 | book title: book-D     |
002       | client_2 | books  | 104 | book title: book-E     |
002       | client_2 | movies | 200 | movie title: movie-A   |
002       | client_2 | dvds   | 300 | dvd title: dvd-A       |
002       | client_2 | dvds   | 301 | dvd title: dvd-B       |
002       | client_2 | dvds   | 302 | dvd title: dvd-C       |
002       | client_2 | dvds   | 303 | dvd title: dvd-D       |

这是我的jq 片段

任何帮助将不胜感激。

给你 go

jq --compact-output '.report.clients[] | [.id, .name] + ((.books[] | ["books", .sku, .description]), (.movies[] | ["movie", .sku, .description]), (.dvds[] | ["dvds", .sku, .description]))'

["001","client_1","books","100","book title: book-A"]
["001","client_1","books","101","book title: book-B"]
["001","client_1","books","102","book title: book-C"]
["001","client_1","movie","200","movie title: movie-A"]
["001","client_1","movie","201","movie title: movie-B"]
["001","client_1","dvds","300","dvd title: dvd-A"]
["002","client_2","books","100","book title: book-A"]
["002","client_2","books","101","book title: book-B"]
["002","client_2","books","102","book title: book-C"]
["002","client_2","books","103","book title: book-D"]
["002","client_2","books","104","book title: book-E"]
["002","client_2","movie","200","movie title: movie-A"]
["002","client_2","dvds","300","dvd title: dvd-A"]
["002","client_2","dvds","301","dvd title: dvd-B"]
["002","client_2","dvds","302","dvd title: dvd-C"]
["002","client_2","dvds","303","dvd title: dvd-D"]

在线尝试!

如果你想要真正的 CSV 你可以添加| @csv | @csv最后

jq --compact-output '.report.clients[] | [.id, .name] + ((.books[] | ["books", .sku, .description]), (.movies[] | ["movie", .sku, .description]), (.dvds[] | ["dvds", .sku, .description])) | @csv'

"\"001\",\"client_1\",\"books\",\"100\",\"book title: book-A\""
"\"001\",\"client_1\",\"books\",\"101\",\"book title: book-B\""
"\"001\",\"client_1\",\"books\",\"102\",\"book title: book-C\""
"\"001\",\"client_1\",\"movie\",\"200\",\"movie title: movie-A\""
"\"001\",\"client_1\",\"movie\",\"201\",\"movie title: movie-B\""
"\"001\",\"client_1\",\"dvds\",\"300\",\"dvd title: dvd-A\""
"\"002\",\"client_2\",\"books\",\"100\",\"book title: book-A\""
"\"002\",\"client_2\",\"books\",\"101\",\"book title: book-B\""
"\"002\",\"client_2\",\"books\",\"102\",\"book title: book-C\""
"\"002\",\"client_2\",\"books\",\"103\",\"book title: book-D\""
"\"002\",\"client_2\",\"books\",\"104\",\"book title: book-E\""
"\"002\",\"client_2\",\"movie\",\"200\",\"movie title: movie-A\""
"\"002\",\"client_2\",\"dvds\",\"300\",\"dvd title: dvd-A\""
"\"002\",\"client_2\",\"dvds\",\"301\",\"dvd title: dvd-B\""
"\"002\",\"client_2\",\"dvds\",\"302\",\"dvd title: dvd-C\""
"\"002\",\"client_2\",\"dvds\",\"303\",\"dvd title: dvd-D\""

在线尝试!

如果您想要一些 CSV 风格的东西,但不是真正的 CSV,请查看join 例如

jq --compact-output --raw-output '.report.clients[] | [.id, .name] + ((.books[] | ["books", .sku, .description]), (.movies[] | ["movie", .sku, .description]), (.dvds[] | ["dvds", .sku, .description])) | join("|")'

001|client_1|books|100|book title: book-A
001|client_1|books|101|book title: book-B
001|client_1|books|102|book title: book-C
001|client_1|movie|200|movie title: movie-A
001|client_1|movie|201|movie title: movie-B
001|client_1|dvds|300|dvd title: dvd-A
002|client_2|books|100|book title: book-A
002|client_2|books|101|book title: book-B
002|client_2|books|102|book title: book-C
002|client_2|books|103|book title: book-D
002|client_2|books|104|book title: book-E
002|client_2|movie|200|movie title: movie-A
002|client_2|dvds|300|dvd title: dvd-A
002|client_2|dvds|301|dvd title: dvd-B
002|client_2|dvds|302|dvd title: dvd-C
002|client_2|dvds|303|dvd title: dvd-D

在线尝试!

如果您有任何问题,请告诉我。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM