Разобрать JSON в CSV, используя jq, но разделить подсписок на несколько записей. - PullRequest
0 голосов
/ 15 октября 2019

Я анализирую результат JSON, полученный из Azure RateAPI, и хочу преобразовать его в стандартный файл CSV.

Следующая строка - это то, что я использую для преобразования его в CSV, и он работает, но поскольку один из атрибутов является списком, он не дает мне результат, который я ищу. Для каждого элемента в «подсписке» мне нужно создать еще одну запись в моем CSV-файле.

cat myfile.json | jq -r '.Meters[] | [ .EffectiveDate, .IncludedQuantity, .MeterCategory, .MeterId, .MeterName, .MeterRates[], .MeterRegion, .MeterStatus, .MeterSubCategory, .MeterTags[], .Units] | @csv'

Вот 3 записи, которые я пытаюсь проанализировать. У меня проблемы с записью 2, потому что MeterRates - это список, в котором мне нужны и атрибут, и значение. Мне понадобится запись 2 после анализа, чтобы соответствовать 3 записям в файле CSV, где каждая запись содержит один элемент списка в MeterRates. Пример ожидаемого результата в конце

  "OfferTerms": [],
  "Meters": [
    {
      "EffectiveDate": "2019-03-01T00:00:00Z",
      "IncludedQuantity": 0,
      "MeterCategory": "Virtual Machines",
      "MeterId": "d0bf9053-17c4-4fec-8502-4eb8376343a7",
      "MeterName": "F2/F2s Low Priority",
      "MeterRates": {
        "0": 0.0766
      },
      "MeterRegion": "US West 2",
      "MeterStatus": "Active",
      "MeterSubCategory": "F/FS Series Windows",
      "MeterTags": [],
      "Unit": "1 Hour"
    },
    {
      "EffectiveDate": "2014-11-01T00:00:00Z",
      "IncludedQuantity": 0,
      "MeterCategory": "Azure DevOps",
      "MeterId": "c4d6fa88-0df9-4680-867a-b13c960a875f",
      "MeterName": "Virtual User Minute",
      "MeterRates": {
        "0": 0.0004,
        "1980000": 0.0002,
        "9980000": 0.0001
      },
      "MeterRegion": "",
      "MeterStatus": "Active",
      "MeterSubCategory": "Cloud-Based Load Testing",
      "MeterTags": [],
      "Unit": "1/Month"
    },
    {
      "EffectiveDate": "2017-04-01T00:00:00Z",
      "IncludedQuantity": 0,
      "MeterCategory": "SQL Database",
      "MeterId": "cb770eab-d5c8-45fd-ac56-8c35069f5a29",
      "MeterName": "P4 DTUs",
      "MeterRates": {
        "0": 68.64
      },
      "MeterRegion": "IN West",
      "MeterStatus": "Active",
      "MeterSubCategory": "Single Premium",
      "MeterTags": [],
      "Unit": "1/Day"
    }
    ]
}

Фактические результаты с использованием предоставленного мною кода следующие:

"2019-03-01T00:00:00Z",0,"Virtual Machines","d0bf9053-17c4-4fec-8502-4eb8376343a7","F2/F2s Low Priority",0.0766,"US West 2","Active","F/FS Series Windows",
"2014-11-01T00:00:00Z",0,"Azure DevOps","c4d6fa88-0df9-4680-867a-b13c960a875f","Virtual User Minute",0.0004,0.0002,0.0001,"","Active","Cloud-Based Load Testing",
"2017-04-01T00:00:00Z",0,"SQL Database","cb770eab-d5c8-45fd-ac56-8c35069f5a29","P4 DTUs",68.64,"IN West","Active","Single Premium",

но результат, который я ожидаю, - (запись 2 соответствуетдо 3 записей в CSV-файле на основе MeterRates):

"2019-03-01T00:00:00Z",0,"Virtual Machines","d0bf9053-17c4-4fec-8502-4eb8376343a7","F2/F2s Low Priority",0,0.0766,"US West 2","Active","F/FS Series Windows",
"2014-11-01T00:00:00Z",0,"Azure DevOps","c4d6fa88-0df9-4680-867a-b13c960a875f","Virtual User Minute",0,0.0004,"","Active","Cloud-Based Load Testing",
"2014-11-01T00:00:00Z",0,"Azure DevOps","c4d6fa88-0df9-4680-867a-b13c960a875f","Virtual User Minute",1980000,0.0002,"","Active","Cloud-Based Load Testing",
"2014-11-01T00:00:00Z",0,"Azure DevOps","c4d6fa88-0df9-4680-867a-b13c960a875f","Virtual User Minute",9980000,0.0001"","Active","Cloud-Based Load Testing",
"2017-04-01T00:00:00Z",0,"SQL Database","cb770eab-d5c8-45fd-ac56-8c35069f5a29","P4 DTUs",0,68.64,"IN West","Active","Single Premium",

Спасибо за помощь.

1 Ответ

0 голосов
/ 15 октября 2019

Вы захотите добавить шаг между получением Meters предметов и выводом строк, чтобы выводить различные комбинации Meters предметов с разными скоростями. Как у вас есть прямо сейчас, вы выводите тарифы в виде других элементов для строки, что на самом деле не то, что вам нужно.

В этом случае вы можете просто добавить новое свойство для хранения значениясоответствующий MeterRate.

.Meters[] | .MeterRate = (.MeterRates | to_entries[])
    | [.EffectiveDate, .IncludedQuantity, .MeterCategory, .MeterId , .MeterName,
       .MeterRate.key, .MeterRate.value,
       .MeterRegion, .MeterStatus, .MeterSubCategory, .MeterTags[], .Units]
    | @csv

Возможно, вы захотите сделать что-то подобное для элементов MeterTags, чтобы у вас не было потенциально случайного числа столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...