json - 如何从 json 数组获取最新日期键值对(包括父键)

标签 json jq

1) 我正在尝试使用 jq 从 json 生成 CSV 文件。 2)我需要父键以及子数组中的一个键值对 3)其中包含最新日期的值将是生成的键值对 4) 需要从该结果生成 csv

这是我的 json

{
    "students": [
        {
            "name": "Name1",
            "class": "parentClass1",
            "teacher": "teacher1",
            "attendance": [
                {
                    "key": "class1",
                    "value": "01-DEC-2018"
                },
                {
                    "key": "class1",
                    "value": "28-Nov-2018"
                },
                {
                    "key": "class1",
                    "value": "26-Oct-2018"
                }
            ]
        },
        {
            "name": "Name2",
            "class": "parentClass2",
            "teacher": "teacher2",
            "attendance": [
                {
                    "key": "class2",
                    "value": "05-DEC-2018"
                },
                {
                    "key": "class2",
                    "value": "25-Nov-2018"
                },
                {
                    "key": "class2",
                    "value": "20-Oct-2018"
                }
            ]
        }
    ]
}

我没有取得太大进展,我正在尝试创建这样的 csv

jq  '.students[] | [.name, .class, attendance[].key,.properties[].value] | @csv ' main.json

下面是该 json 的预期 CSV

Name         ParentClass        key         dateValue                                                                           Summary
Name1        parentClass1      class1       150 days ago(difference with today date with latest date i.e 01-DEC-2018 )         Teacher1.parentClass1
Name2        parentClass2      class2       150 days ago(difference with today date with latest date i.e 05-DEC-2018 )         Teacher2.parentClass2

最佳答案

使用strptime解析日期并将结果分配给value,这样您就可以使用max_by获取最新的出勤.使用 mktime转换为自纪元以来的秒数,从现在中减去它,除以 24 * 60 * 60 以获得自此以来的天数。

$ jq -r '
def days_since:
  (now - .) / 86400 | floor;
.students[]
| [ .name, .class ] +
  ( .attendance
    | map(.value |= strptime("%d-%b-%Y"))
    | max_by(.value)
    | [ .key, "\(.value | mktime | days_since) days ago" ]
  ) +
  [ .teacher + "." + .class ]
| @tsv' file
Name1   parentClass1    class1  148 days ago    teacher1.parentClass1
Name2   parentClass2    class2  144 days ago    teacher2.parentClass2

请注意,此解决方案不处理夏令时更改。

关于json - 如何从 json 数组获取最新日期键值对(包括父键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55888155/

相关文章:

jquery - Ajax json 到 MVC5 Controller : Passing object containing a collection

json - 使用 jq 只从流中获取第一个 json 对象,不要触摸其余的

json - 从命令行参数生成 JSON

json - 如何解析 json 但将一个特定节点序列化为字符串?

json - react 原生json响应检查字符串或对象

javascript - 在 JSON 文件中创建时间线并根据该 JSON 中的日期时间更新页面

java - 如何使用 Jackson 将 JSON 数组中的子文档表示为 Java Collection?

json - 转换 json 文件

json - 使用 jq 换行

bash - 通过 bash 过滤 json - 不区分大小写