вопрос новичка относительно многомерного массива - PullRequest
0 голосов
/ 01 февраля 2020

Итак, у меня есть этот массив информации, который я собираю из своей подписки azure, которая конвертируется из json:

$Request += (((az consumption usage list --subscription $subscriptionID --start-date $CycleStart --end-date $CycleEnd) 2> $null | ConvertFrom-Json) | select subscriptionname, instanceName, usageStart, usageEnd, pretaxCost, tags )

, которая производит массив, который выглядит нормально:

$Request 

subscriptionName : Sub1
instanceName : VM1
usageStart : 2020-01-27T00:00:00Z
usageEnd : 2020-01-27T23:59:59Z
pretaxCost : 3.194
tags : @{Classification=ABC, Zone=123, Field=qaz, Org=CAL, Owner=Bob@dev}

subscriptionName : Sub1
instanceName : VM2
usageStart : 2020-01-27T00:00:00Z
usageEnd : 2020-01-27T23:59:59Z
pretaxCost : 2.1
tags : @{Classification=zzz, Zone=123, Field=qaz, Org=NZ, Owner=John@prod}

Но, как вы видите, поле «теги» выглядит объединенным между @ {xxxx}. То, что я хотел бы получить и не смог после нескольких часов проб и ошибок (!), Выглядит примерно так:

subscriptionName : Sub1
instanceName : VM1
usageStart : 2020-01-27T00:00:00Z
usageEnd : 2020-01-27T23:59:59Z
pretaxCost : 3.194
Classification : ABC
Zone : 123
Field : qaz
Org : CAL
Owner : Bob@dev

subscriptionName : Sub1
instanceName : VM2
usageStart : 2020-01-27T00:00:00Z
usageEnd : 2020-01-27T23:59:59Z
pretaxCost : 2.1
Classification : ABC
Zone : 222
Field : BIZ
Org : NZ
Owner : John@dev

Но ... поле, вложенное в теги, может со временем меняться, поэтому я могу не зашифровывает что-то, что будет искать "Классификация", "Зона", "Поле" и т. д. c ...)

Может кто-нибудь помочь мне с этим? :)

Я наткнулся на этот сценарий, думая, что он может помочь, но не смог заставить его работать .. https://github.com/solidstate888/JSON-ToCSV

1 Ответ

1 голос
/ 02 февраля 2020

Судя по виду поля tags, я считаю, что это таблица ha sh.

Это можно проверить, изучив тип свойства tags в одном из элементов массива:

$Request[0].tags | Get-Member

Должно отображаться:

enter image description here

Итак, для каждой записи таблицы ha sh все, что вам нужно сделать, это вывести каждый га sh табличный ключ (который является именем поля) и его га sh табличное значение (которое является значением поля)

Обратите внимание, что блок кода над комментарием #code to output the input array существует только для создайте массив из двух строк, который имитирует то, что я вижу в вашем вопросе. Код, который, я считаю, вам нужен (код для вывода содержимого массива), находится ниже комментария #code to output the input array. В частности, см. L oop foreach($tag in $object.tags.keys). Этот l oop выводит любой набор пар ключ + значение, присутствующий в поле tags (таблица ha sh) входного массива. Это относится к утверждению в вашем вопросе:

Но ... поле, вложенное в теги, со временем может измениться

Обратите внимание, что в моих смоделированных объектах есть два различные наборы пар ключ + значение в таблице тегов ha sh, и мой код имеет дело с выводом различного содержимого.

cls

#code to create simulated array that looks like the content of your question
#In your program, I assume that this array is created by using ConvertFrom-Json 
$Request = New-Object System.Collections.ArrayList
$field = [ordered]@{}

$field.subscriptionName  = 'Sub1'
$field.instanceName = 'VM1'
$field.usageStart  = Get-Date -Date '2020-01-27T00:00:00Z'
$field.usageEnd = Get-Date -Date '2020-01-27T23:59:59Z'
$field.pretaxCost = 3.194
$field.tags = @{Classification='ABC'; Zone=123; Field='qaz'; Org='CAL'; Owner='Bob@dev'}
$Request.Add((New-Object PSObject -Property $field)) | out-null

$field.subscriptionName  = 'Sub1'
$field.instanceName = 'VM2'
$field.usageStart  = Get-Date -Date '2020-01-27T00:00:00Z'
$field.usageEnd = Get-Date -Date '2020-01-27T23:59:59Z'
$field.pretaxCost = 2.1
#Note that this tags hash table has content that is different when compared to the tags hash table in the first element of the array above
$field.tags = @{Foo1='foo1'; Foo2="Foo2"; Field='qaz'; Foo3=6677}
$Request.Add((New-Object PSObject -Property $field)) | out-null

#code to output the input array

foreach ($fieldItem in $Request)
{
    write-host ("subscriptionName={0}" -f $fieldItem.subscriptionName)
    write-host ("instanceName={0}" -f $fieldItem.instanceName)
    write-host ("usageStart={0}" -f $fieldItem.usageStart)
    write-host ("usageEnd={0}" -f $fieldItem.usageEnd)
    write-host ("pretaxCost={0}" -f $fieldItem.pretaxCost)

    foreach($tag in $fieldItem.tags.keys)
    {
        write-host ("{0}={1}" -f $tag, $fieldItem.tags.$tag)
    }

    write-host
}   

Вывод

enter image description here

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