[英]Iterating over JSON using jq and convert to CSV
我有以下 JSON 有效负载,我想使用jq
将其展平,然后转换为 CSV。
我遇到的问题是我不确定如何处理books
、 movies
和dvds
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"}
]
}
]
}
}
对于客户拥有的每book
、 movie
和dvd
,我需要引用客户 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.