Powershell Array - mesma localização combinando

1

Eu tenho um script que retorna as seguintes informações

Analog Phones   IP Phones   Location
-------------   ---------   --------
0               883         Site1
413             0           Site1
0               4           Site1
0               258         Site2
9               75          Site2
183             0           Site2

Esta informação é armazenada em um array $ arrayX

Estou tentando descobrir como fazer com que a saída seja exibida

Analog Phones   IP Phones   Location
-------------   ---------   --------
413             887         Site1
192             333         Site2

Os dados que alimentam o array não são apresentados de tal forma; Alguém tem alguma idéia sobre como realizar algo assim? Eu posso postar todo o script, mas é uma confusão de java, axl e powershell agora.

Há um ponto no script em que os dados se parecem com isso

Analog Phones   IP Phones   Location
-------------   ---------   --------
413             0           Site1-AGW-DP
0               883         Site1-PHONES-DP
0               4           Site1-PHSRST-DP

Os arquivos XML que estão sendo usados são gerados por um programa java axl. os resultados de um deles são mostrados abaixo:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <axl:executeSQLQueryResponse xmlns:axl="http://www.cisco.com/AXL/API/6.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" sequence="1394831301468">
            <return>
                <row>
                    <analog_phones>0</analog_phones>
                    <ip_phones>47</ip_phones>
                    <devicepool>Site20-PHONES-DP</devicepool>
                </row>
                <row>
                    <analog_phones>533</analog_phones>
                    <ip_phones>0</ip_phones>
                    <devicepool>Site20-AGW-DP</devicepool>
                </row>
                <row>
                    <analog_phones>1</analog_phones>
                    <ip_phones>689</ip_phones>
                    <devicepool>Site20-PHSRST-DP</devicepool>
                </row>
            </return>
        </axl:executeSQLQueryResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Script do Powershell começando após o bit java

$files = (Get-ChildItem .\*out.xml).name
foreach ($file in $files){
    [xml]$xmlfiles = gc $file
    $finalxml += $xmlfiles.envelope.body.executeSQLQueryResponse.return.row
    Remove-Item $pwd\$file
}
$outarray  = @()
$sitelist = import-csv sites.csv
foreach($item in $finalxml){
    if(!$item.devicepool){$sed="BLANK"}
    else{$sed=($item.devicepool).substring(0,4)}
    $location=($sitelist | where-object {$_.prefix -eq $sed}).Facility
    if(!$location){$location=$sed}
    $outarray+=New-object psobject -property @{
        'Analog Phones' = $item.analog_phones
        'IP Phones' = $item.ip_phones
        'Location' = $location
    }
}

$outarray | Sort-Object 'Analog Phones','IP PHones' -unique | sort-object Location | select-object 'Analog Phones','IP Phones',Location |export-csv $csvout
    
por driz 14.03.2014 / 21:37

2 respostas

1

Algo como isso deve funcionar:

$result = @()

Function getIndex($location)
{
  for($j = 0; $j -lt $result.Count; $j++) {
    if($result[$j].Location -contains "$location") {
      $index=$j
      break;
    }
  }
  return $index
}

for ($i=0; $i -lt $outarray.length; $i++) {
  $loc=$outarray[$i].Location
  $aphones=$outarray[$i].'Analog Phones'
  $ipphones=$outarray[$i].'IP Phones'
  if(!($result | where-object {$_.Location -eq "$loc"})) {
    $result+=New-object psobject -property @{'Location' = "$loc"; 'Analog Phones' = $aphones; 'IP Phones' = $ipphones}  
    } else {
      $index=getIndex($loc) 
      $result[$index].'Analog Phones' = $result[$index].'Analog Phones' + $aphones
      $result[$index].'IP Phones' = $result[$index].'IP Phones' + $ipphones
   }
}
$result

$result output é:

Analog Phones      IP Phones     Location
-------------      ---------     --------
          413            887     Site1
          192            333     Site2

Aqui está a lógica:

Define an empty $result array to store final results
Iterate over $outarray
  each time a location is found
     if location does not exists in $result then
        add full line from $outarray into $result for this location

     if location already exists in $result then
        retrieve the index for the given location in $result
        update Analog Phones number in $result with values from $outarray + $result for the given location (index)
        update IP Phones number in $result with values from $outarray + $result for the given location (index)

PS: Eu não sou um Powershell Guru, então eu acho que o getIndex poderia ser melhorado. No entanto, funcionou para mim com base no seu código-fonte.

Espero que ajude!

EDITAR

Aqui está a maneira como integrei meu código ao seu:

Primeiro eu criei o $outarray como você (eu acho), exceto que eu usei valores codificados (não analisando um arquivo xml):

$outarray  = @()
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 883;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 413;'IP Phones' = 0;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 4;'Location' = "Site1"}
$outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 258;'Location' = "Site2"}
$outarray+=New-object psobject -property @{'Analog Phones' = 9;'IP Phones' = 75;'Location' = "Site2"}
$outarray+=New-object psobject -property @{'Analog Phones' = 183;'IP Phones' = 0;'Location' = "Site2"}

A partir desse ponto, meu $outarray é assim:

Analog Phones    IP Phones    Location
-------------    ---------    --------
            0          883    Site1
          413            0    Site1
            0            4    Site1
            0          258    Site2
            9           75    Site2
          183            0    Site2

Em seguida, adicionei meu código logo após o comando export-csv :

$outarray | Sort-Object............

MY CODE HERE

EDIT 2

Encontrei um problema com seu código real: os números são interpretados como sequências de caracteres para que não possam ser calculados corretamente. Você tem que convertê-los em números inteiros:

foreach($item in $finalxml){
  ...
  ...
  $outarray+=New-object psobject -property @{
        'Analog Phones' = [int]$item.analog_phones
        'IP Phones' = [int]$item.ip_phones
        'Location' = $location
    }
}
    
por 18.03.2014 / 02:33
1

Pelo que parece, você está tentando combinar todos os resultados em uma única entrada por site? por exemplo. - Total de telefones analógicos e total de telefones IP em cada local.

Se for esse o caso, você deve ser capaz de percorrer esse array. Totalize os telefones analógicos e os telefones IP por site e use esses valores para preencher uma nova matriz.

Se você estiver procurando por algum código, precisaríamos saber como o array é construído para construir a lógica.

    
por 14.03.2014 / 22:00

Tags