在对象中扩展数组?

时间:2019-10-16 20:56:06

标签: powershell

我正在使用一个Web请求来查询电话系统中的用户列表及其队列关联。结果数据被放入对象中,并最终输出到屏幕和CSV中。问题在于许多用户是多个队列的成员,并且结果队列成员资格数据作为数组返回。

这就是我的输出:

First Name Last Name   Extension Skill Group                              Skill Level
---------- ---------   --------- -----------                              -----------
Kylo       Ren         1234      {Sales Support, Customer Service}        {8, 8}
Flip       Zimmerman   4321      {Accounting, Marketing}                  {5, 3}
Clyde      Logan       1122      {Sales Support, Customer Service}        {4, 9}
Ronnie     Peterson    2211      {Sales Support, Customer Service,Claims} {4, 9, 1}
Adam       Sackler     1212      Engineering                              2

如您所见,“技能组”和“技能水平”列表示为数组,并且保存的CSV单元格只有System.Object[],这显然是在说该单元格包含数组。但是,如果用户仅是一个技能组的成员,则返回的数据将是普通字符串,例如上面列表中的Adam Sackler。

我正在努力的事情之一就是我不知道应该如何显示数据?您的一些好建议将不胜感激。

例如,我应该为每个技能组和相关技能级别动态创建列吗?当用户的列少于或多于现有列时,会发生什么?

First Name Last Name   Extension Skill Group 1 Skill Level 1 Skill Group 2    Skill Level 2
---------- ---------   --------- ------------- ------------- -------------    -------------
Kylo       Ren         1234      Sales Support 8             Customer Service 8
Flip       Zimmerman   4321      Accounting    5             Marketing        3

还是每个附加的技能组和技能水平都应该换一个新的一行?应该将其他技能组/级别放在自己的行上还是只在单元格中使用回车键?

First Name Last Name   Extension Skill Group      Skill Level
---------- ---------   --------- -----------      -----------
Kylo       Ren         1234      Sales Support    8
                                 Customer Service 4
Flip       Zimmerman   4321      Accounting       5     
                                 Marketing        3

无论如何,以下是使用数组创建对象的相关代码:

[xml]$resourceCsqInfo = Invoke-WebRequest -Uri $uccxServerBaseUrl"resource?csqid="$($csq.id) -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

[object]$data = $resourceCsqInfo.resources.resource

foreach ($resource in $data) {
    $outputList += New-Object -TypeName PSObject -Property @{
        "First Name"  = $resource.firstName;
        "Last Name"   = $resource.lastName;
        "Extension"   = $resource.extension;
        "Skill Group" = $resource.skillmap.skillcompetency.skillNameUriPair.name;
        "Skill Level" = $resource.skillmap.skillcompetency.competencelevel
    }
}

变量$resource.skillmap.skillcompetency.skillNameUriPair.name$resource.skillmap.skillcompetency.competencelevel是循环中的相关项目。

所以我的问题是这个;如何在对象中扩展数组,以及传达附加信息的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

传达附加信息的最佳方法将完全取决于谁在使用或消耗什么信息。格式化人类的输出格式将不同于按摩输出以进行进一步的程序分析或处理。

通常,第一个示例中的动态列选项仅在可能的列数很小的情况下才起作用。即便如此,以编程方式同时以视觉方式理解仍然有些混乱。

第二个选项是您已经拥有的输出的更易于阅读的版本。但是使它看起来像这样的方法基本上会将其变成纯文本,您无法对其进行任何进一步的处理。

我的首选选项通常是第二个选项的变体。与其尝试从后续技能行中省略名称/扩展名数据,不如复制它。因此,Kylo最初具有两种技能的条目变成了两个不同的Kylo条目,每个条目都具有不同的技能。在数据库世界中称为非规范化。

在foreach循环中,您将具有一个子循环,该子循环遍历技能集合,然后为每种技能输出一个对象,而不是为单个$resource输出一个对象。所以也许是这样的:

foreach ($resource in $data) {
    for ($i=0; $i -lt @($resource.skillmap.skillcompetency.skillNameUriPair).Count; $i++) {
        [pscustomobject]@{
            'First Name' = $resource.firstName
            'Last Name' = $resource.lastName
            'Extension' = $resource.extension
            'Skill Group' = $resource.skillmap.skillcompetency.skillNameUriPair[$i].name
            'Skill Level' = $resource.skillmap.skillcompetency.competencelevel[$i]
        }
    }
}