【问题标题】:Convert JSON to CSV - string manipulation (jq, bash, awk, sed, etc.)将 JSON 转换为 CSV - 字符串操作(jq、bash、awk、sed 等)
【发布时间】:2019-04-07 05:25:14
【问题描述】:

我迫切需要脚本的帮助,以便将 JSON 文本基本上转换为 CSV 文本,以尝试将用户从一个 AWS Cognito 用户池复制到另一个。

导出的 JSON 如下所示:

{
    "Users": [
        {
            "Username": "user.name",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "some-value"
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "custom:jobtitle",
                    "Value": Director"
                },
                {
                    "Name": "custom:user_id",
                    "Value": "38"
                },
                {
                    "Name": "email",
                    "Value": "foo.bar@email.com"
                }
            ],
            "UserCreateDate": some-value,
            "UserLastModifiedDate": some-value,
            "Enabled": some-value,
            "UserStatus": "some-value"
        }
        [more lines down here]... 
    ] }

那么 CSV 文件将包含以下行:

,,,,,,,,,foo.bar@email.com,TRUE,,,,,,FALSE,,,Director,,38,FALSE,foo.bar
[more lines down here]...

所以,对于 JSON,变量应该是这样的:

{
    "Users": [
        {
            "Username": "%USERNAME%",
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "some-value"
                },
                {
                    "Name": "email_verified",
                    "Value": "true"
                },
                {
                    "Name": "custom:jobtitle",
                    "Value": %JOB_TITLE%"
                },
                {
                    "Name": "custom:user_id",
                    "Value": "%USER_ID%"
                },
                {
                    "Name": "email",
                    "Value": %EMAIL%"
                }
            ],
            "UserCreateDate": some-value,
            "UserLastModifiedDate": some-value,
            "Enabled": some-value,
            "UserStatus": "some-value"
        }
        ...
    ]
}

对于 CSV 也是这样:

,,,,,,,,,%EMAIL%,TRUE,,,,,,FALSE,,,%JOB_TITLE%,,%USER_ID%,FALSE,%USERNAME%

其中%EMAIL%%JOB_TITLE%%USER_ID%%USERNAME% 是变量,其他一切都应该只是字符串。

感谢您对高级人员的帮助。

【问题讨论】:

    标签: json csv export-to-csv amazon-cognito jq


    【解决方案1】:

    首先考虑这个过滤器:

    .Users[].Attributes
    | map(select(.Name | . == "custom:jobtitle" or . == "custom:user_id" or . == "email") )
    | from_entries
    | [ .email, .["custom:jobtitle"], .["custom:user_id"] ]
    | @csv
    

    这里使用的技巧是使用from_entries 将名称/值对数组转换为以名称为键的对象。

    假设 Q 中所示的行中的 JSON 输入有效,使用 -r 选项调用 jq 将产生:

    "foo.bar@email.com","Director","38"
    

    很遗憾,我不太清楚确切的要求,但您应该能够根据自己的需要调整以上内容。

    【讨论】:

    • 感谢您的脚本,我的目标就差不多了。这是我需要的输出:,,,,,,,,,foo.bar@email.com,TRUE,,,,,,FALSE,,,Director,,38,FALSE,foo.bar 如何将固定字符串添加到输出中?以及如何在输出中获取用户名?与此同时,我正在尝试自己修改脚本。
    猜你喜欢
    • 2019-11-21
    • 2021-09-03
    • 2016-03-24
    • 2019-08-07
    • 2022-08-02
    • 2018-05-08
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多