Estoy usando una solicitud web para consultar mi sistema telefónico para obtener una lista de usuarios y su asociación de cola. Los datos resultantes se colocan en un objeto y, finalmente, se envían a la pantalla y a un archivo CSV. El problema es que muchos usuarios son miembros de varias colas y los datos de pertenencia a la cola resultantes se devuelven como una matriz.

Así que así es como se ve mi salida:

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

Como puede ver, las columnas "Skill Group" y "Skill Level" están representadas como matrices y el CSV que se guarda solo tiene System.Object[] para la celda que obviamente solo dice que la celda contiene una matriz. Sin embargo, si el usuario es miembro de un solo grupo de habilidades, los datos devueltos serán una cadena normal, como Adam Sackler en la lista anterior.

Una de las cosas con las que estoy luchando es que no sé cómo se deben mostrar los datos. Agradeceríamos algunas sugerencias de ustedes, buenos amigos.

Por ejemplo, ¿debería crear columnas dinámicamente para cada grupo de habilidades y nivel de habilidad asociado? ¿Qué sucede cuando un usuario tiene menos o más columnas de las que ya están allí?

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

¿O debería cada grupo y nivel de habilidad adicional estar en una nueva línea? ¿Debería el grupo / nivel de habilidad adicional estar en su propia fila o simplemente usar un retorno de carro en la celda?

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

En cualquier caso, aquí está el código relevante que está creando el objeto con las matrices:

[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
    }
}

Las variables $resource.skillmap.skillcompetency.skillNameUriPair.name y $resource.skillmap.skillcompetency.competencelevel son los elementos relevantes en el ciclo.

Así que mi pregunta es esta; ¿Cómo amplío matrices en un objeto y cuál es la mejor manera de transmitir la información adicional?

1
D. Thornhill 16 oct. 2019 a las 23:56

1 respuesta

La mejor respuesta

La mejor forma de transmitir la información adicional dependerá por completo de quién o qué la consuma. Dar formato a la salida para un ser humano será diferente a dar masajes a la salida para su posterior análisis programático o manipulación.

Generalmente, la opción de columna dinámica en su primer ejemplo solo funciona en escenarios cuando el número posible de columnas es muy pequeño. E incluso entonces, es un poco complicado trabajar con programación y entender visualmente.

La segunda opción es una versión más legible por humanos de la salida que ya tiene. Pero la forma de hacer que se vea así básicamente lo convierte en texto sin formato en el que no puede trabajar más.

Mi opción preferida suele ser una variación de la segunda opción. En lugar de intentar omitir los datos de Nombre / Extensión de las siguientes filas de habilidades, simplemente duplíquelos. Entonces, la entrada original de Kylo con dos habilidades se convierte en dos entradas de Kylo diferentes, cada una con una habilidad diferente. Esto se conoce en el mundo de las bases de datos como desnormalización.

Dentro de su bucle foreach, tendrá un sub bucle que iterará sobre la colección de habilidades y luego generará un objeto para cada habilidad en lugar de solo uno para el $resource individual. Entonces tal vez algo como esto:

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]
        }
    }
}
3
Ryan Bolger 16 oct. 2019 a las 21:36