Сравните 2 JSON -файлы и создайте новый ключ, если значения совпадают - PullRequest
1 голос
/ 26 марта 2020

У меня есть 2 набора JSON -файлов, похожих на приведенные ниже, data-A.json и data-B.json.

Мне нужно как-то сравнить ключ URL в data-A.json с тем же ключом в data-B.json. В случае совпадения возьмите данные с ключа Position в data-A.json и запишите в новый ключ PreviousPosition в data-B.json. Если не найдено совпадений URL, запишите нулевое значение для этого нового ключа в data-B.json

См. Примеры:

data-A. json

[
    {
        "Position": "1",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123"
    },
    {
        "Position": "2",
        "TrackName": "Random song",
        "URL": "https://domain.local/123qwe"
    },
    {
        "Position": "3",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456"
    }
]

data-B. json

[
    {
        "Position": "1",
        "TrackName": "Rocket",
        "URL": "https://domain.local/nbs678"
    },
    {
        "Position": "2",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456"
    },
    {
        "Position": "3",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123"
    }
]

(желательно) data-B. json

[
    {
        "Position": "1",
        "TrackName": "Rocket",
        "URL": "https://domain.local/nbs678",
        "PreviousPosition": null
    },
    {
        "Position": "2",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456",
        "PreviousPosition": "3"
    },
        {
        "Position": "3",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123",
        "PreviousPosition": "1"
    }
]

Я предпринял несколько посредственных попыток решить эту проблему, используя jq , но безуспешно. Также попробовал некоторые PowerShell и Python, но я просто не могу понять.

Есть предложения?

1 Ответ

2 голосов
/ 26 марта 2020

Если вам нужно простое двухстрочное решение, то jq - хороший выбор:

(INDEX($A[]; .URL) | map_values(.Position)) as $dict
| map( .PreviousPosition = $dict[ .URL ] )

Возможно, это более просто, чем кажется, как выражение в первом Строка - это часто встречающаяся идиома (а именно INDEX(...) | map_values(...)) для создания словаря. В первой строке предполагается, что $ A содержит JSON в data-A. json.

Во второй строке просто применяется правило поиска, указанное в вопросе.

Единственный сложный момент здесь - правильно понять вызов командной строки. Будет достаточно следующего:

jq --argfile A data-A.json -f program.jq data-B.json

, где program.jq содержит вышеуказанную двухстрочную программу.

...