发布
社区首页 >问答首页 >使用jq解析JSON数据并转换为csv

使用jq解析JSON数据并转换为csv
EN

Unix & Linux用户
提问于 2019-03-21 05:08:32
回答 1查看 8.6K关注 0票数 1

我正在下载api json数据,并将其转换成csv文件的最终结果。

样本数据如下所示:

代码语言:javascript
复制
{
    "content": [{
            "Title": "abc",
            "brand": "xyz",
            "information": {
                "c1": "101",
                "c2": "11111",
                "c3": "a,b,c,d,e:abc."
            }
        },
        {
            "Title": "RX100",
            "brand": "Yamaha",
            "information": {
                "c1": "102",
                "c2": "22222",
                "c3": "a."
            }
        },
        {
            "Title": "victor",
            "brand": "TVS",
            "information": {
                "c1": "103",
                "c2": "33333",
                "c3": "a,b,c"
            }
        },
        {
            "Title": "R15",
            "brand": "Yamaha",
            "information": {
                "c1": "104",
                "c2": "44444",
                "c3": "a,b"
            }
        }
    ]
}

我已经成功下载并转换成多个csv的基础上的标题。数据在多个csv文件中转换后,如下表所示。

代码语言:javascript
复制
Headers-> c1,c2,c3
csv1-->   101,11111,a,b,c,d,e:abc.
csv2-->   102,22222,a.
csv3-->   103,33333,a,b,c.
csv4-->   104,44444,a,b.

但是我想要上面的数据在下面的形式。

代码语言:javascript
复制
Headers-> c1,c2,c3,c4,c5,c6,c7
csv1-->   101,11111,a,b,c,d,e:abc.
csv2-->   102,22222,a.
csv3-->   103,33333,a,b,c.
csv4-->   104,44444,a,b.

是否可以使用json在我的json文件中根据",“将c3划分为不同的列数。列c3将根据存在的元素数进行划分,并将是c3数据的最大值。

EN

回答 1

Unix & Linux用户

发布于 2019-03-21 05:54:52

对于这些准确的数据,

代码语言:javascript
复制
jq -r '.content[].information | [.c1, .c2, .c3] | join(",")' < sample.json

只需在三列之间插入逗号就可以复制已连接的upCSV文件的效果。对于更复杂的真实数据,尤其是数字数据,这将更好地发挥作用:

代码语言:javascript
复制
jq -r '.content[].information | [.c1, .c2, (.c3|split(",")|.[])] | @csv' < sample.json

这一次都是相当标准的,达到了.c3|split(",")|.[]

  1. 提取列3's值
  2. 将该值拆分为逗号上的数组。
  3. 使数组变平。

然后,@csv将数组转换为CSV格式。这将为示例文件产生以下输出:

代码语言:javascript
复制
"101","11111","a","b","c","d","e:abc."
"102","22222","a."
"103","33333","a","b","c"
"104","44444","a","b"

如果您不需要引号,最可靠的方法是使用@tsv,只需替换选项卡:

代码语言:javascript
复制
jq -r '.content[].information|[.c1, .c2, .c3|split(",")|.[]] | @tsv|gsub("\t"; ",")' < sample.json

如果您的所有值都是字符串,也可以再次使用join(",")

如果您也希望创建文字标题行c1,...c7,这将完成以下操作:

代码语言:javascript
复制
jq -r '[.content[].information|[.c1, .c2, (.c3|split(",")|.[])]] | (([range([.[] | length] | max)|"c" + (.+1|tostring)]|join(",")), (.[] | join(",")))' < sample.json

有三个部分:第一部分像前面一样创建列数组,然后其他两个部分使用它作为输入:

  1. ([range([.[] | length] | max)|"c" + (.+1|tostring)]|join(","))生成标题行:它通过生成一个行长度数组来找到任何行的最大长度,创建一个范围0..maximum并在其上映射以创建一个“c1”.“c7”数组,然后将它们与逗号连接在一起。
  2. (.[] | join(","))类似于我们之前的下半部分,同样适用于@csv
票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/507615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档