Преобразование имени и значения в столбец и строки во время экспорта в CSV в Powershell - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь преобразовать имя и значения, возвращенные из моего вызова API, в столбцы и строки во время экспорта, но пока мне не повезло.

$searchResponse =  Invoke-RestMethod -Method POST -Uri $searchUri -ContentType application/json -Header $requestHeader  -Body $searchResultsRequest

$lists =  $searchResponse.businessO.fields | Select name, value 

Возвращает список $:

name            value
----             ----
Name           YY
Address        ABC street
City           Seattle
Zip            01256
Name           XYZ
Address        XYZ street
City           XYZ 
Zip            45456
Name           Mike
Address        1256 Street   
City           New York
Zip            78965

Я хочу вывести этот результат в CSV следующим образом:

Name     Address     City         Zip 
YY       ABC street  Seattle     01256
.
.
.

Я попытался просмотреть список и применилусловие для проверки имени и заполнения значения на его основе, но в итоге я получаю либо дубликаты, либо все мои выходные данные вышли из sysnc, что означает, что Майк получает адрес YY и так далее ...

If($lists.count -ge 0){
    ForEach($list in $lists){
         if($list.name -eq "Name")      {$name= $list.value }
}

Iбыл бы очень признателен за любую помощь в этом.Спасибо.

$ searchResponse results $ searchResponse | ConvertTo-Json

{
    "businessObjects":  [
                            {
                                "busObId":  "xxxxxxxxxxxxxx",
                                "busObPublicId":  "abc345",
                                "busObRecId":  "xxxxxxxxxxxxxxxxxxx",
                                "fields":  "       ",
                                "links":  "",
                                "errorCode":  null,
                                "errorMessage":  null,
                                "hasError":  false
                            },
                            {
                                "busObId":  "xxxxxxxxxxxxx",
                                "busObPublicId":  "rty567",
                                "busObRecId":  "xxxxxxxxxxxxxxxx",
                                "fields":  "       ",
                                "links":  "",
                                "errorCode":  null,
                                "errorMessage":  null,
                                "hasError":  false
                            }
                        ],
    "hasPrompts":  false,
    "links":  [

              ],
    "prompts":  [

                ],
    "searchResultsFields":  [

                            ],
    "totalRows":  2500
}

У полей есть имя и значение, которые я хочу вывести.$ searchResponse.businessObjects.fields | ConvertTo-Json

[
    {
        "dirty":  false,
        "displayName":  "Name",
        "fieldId":  "xxxxxxxxxxx",
        "html":  null,
        "name":  "Name",
        "value":  "Mike"
    },
    {
        "dirty":  false,
        "displayName":  "Address",
        "fieldId":  "456451212113132",
        "html":  null,
        "name":  "Address",
        "value":  "Seattle"
    },

и так далее.

1 Ответ

0 голосов
/ 13 февраля 2019

Этот ответ, как учебное упражнение с ожиданием, можно будет пройти через код в отладчике VSCode или ISE и узнать больше об объектах, членах и т. Д.

Есть несколько способов решенияэтот.В этом ответе я попытаюсь разбить шаги таким образом, чтобы более новый пользователь PowerShell мог больше узнать о языке.

# mock your data
$list1 = @(
[pscustomobject]@{Name='YY'},
[pscustomobject]@{Address='ABC street'},
[pscustomobject]@{City='Seattle'},
[pscustomobject]@{Zip='01256'},
[pscustomobject]@{Name='XYZ'},
[pscustomobject]@{Address='XYZ street'},
[pscustomobject]@{City='XYZ'},
[pscustomobject]@{Zip='45456'},
[pscustomobject]@{Name='Mike'},
[pscustomobject]@{Address='1256 Street'},
[pscustomobject]@{City='New York'},
[pscustomobject]@{Zip='78965'}
)

# mock your data
$list2 = @(
@{Name='YY'},
@{Address='ABC street'},
@{City='Seattle'},
@{Zip='01256'},
@{Name='XYZ'},
@{Address='XYZ street'},
@{City='XYZ'},
@{Zip='45456'},
@{Name='Mike'},
@{Address='1256 Street'},
@{City='New York'},
@{Zip='78965'}
)

# debuggng...
#$list1
#$list1.GetType()
#$list1[0].GetType()

#$list2
#$list2.GetType()
#$list2[0].GetType()

# seems your data looks like list1

$data = @()
$entry = [ordered]@{}

# transform the data into separate objects based on the field you want
foreach ($item in $list)
{
    if ($item.Name) {$entry.Name = $item.Name}
    elseif ($item.Address) {$entry.Address = $item.Address}
    elseif ($item.City) {$entry.City = $item.City}
    elseif ($item.Zip) {$entry.Zip = $item.Zip; $data += $entry; $entry = [ordered]@{}}
}

# data transformed now into an array of hashtables
# there are a few says to save as csv, one is to just roll your own rather
# than GetEnumerator(), etc.

$out = @()
$out += $data[0].Keys -join ', '
$out += $data | % {
    #$_['Name']+','+$_['Address']+','+$_['City']+','+$_['Zip']
    # or
    #$_.Name+','+$_.Address+','+$_.City+','+$_.Zip
    # or 
    $_.Name,$_.Address,$_.City,$_.Zip -join ', '

}

$out

# save $out to a file, uncomment to use after editing path
#$out | Out-File -FilePath 'c:\mycsvfile.csv'
...