Soma da matriz do Powershell na coluna com base em outra

1

Eu tenho um objeto personalizado recuperado de uma consulta SQL que se parece com isso

É basicamente como eu construí o objeto e funciona bem, mas não consigo encontrar como agrupá-los.

foreach ($row in $result) {
$props = @{ 'MailboxName' = $row.MailboxName
            'PSTsFound' = $row.PSTsFound
            'Messagesremaining' = $row.Messagesremaining
          }
          $obj = New-Object -TypeName PSObject -Property $props
          $userPSTs += $obj
}

Coluna1 Coluna2

Usuário1 3 Usuário1 6 Usuário1 8 Usuário2 10 Usuário2 3 Usuário3 4 Usuário4 6 Usuário4 2

E eu quero transformar isso em

Coluna1 Coluna2 Usuário1 17 Usuário2 13 Usuário3 4 Usuário4 8 Então, basicamente, somamos a coluna2 onde corresponde a coluna1.

Agradecemos antecipadamente por qualquer assistência

    
por user2619126 10.12.2013 / 15:34

1 resposta

1

Suponho que você tenha Column1 e Column2 médio MailboxName e PSTsFound

Se você estiver interessado apenas na soma de PSTsFound para todas as linhas com o mesmo MailboxName e não nas linhas individuais, você pode usar um HashTable com o MailboxName como chave e o objeto inteiro como seu valor. Em seguida, na sua iteração, teste se sua HashTable já contém uma determinada chave. Em caso positivo, adicione o valor à entrada existente:

$SumTable = @{}

foreach ($row in $result) {
    if($SumTable.ContainsKey($row.MailboxName))
    {
        $obj = $SumTable[$row.MailboxName]
        $obj.PSTsFound += $row.PSTsFound
        $obj.Messagesremaining += $row.Messagesremaining
        $SumTable[$row.MailboxName] = $obj
    }
    else
    {
        $props = @{
            'MailboxName' = $row.MailboxName
            'PSTsFound' = $row.PSTsFound
            'Messagesremaining' = $row.Messagesremaining
        }
        $obj = New-Object -TypeName PSObject -Property $props
        $SumTable.Add($obj.MailboxName,$obj)
    }
}

$userPSTs = $SumTable.Values

Se você não deseja modificar a coleção existente, mas apenas deseja produzir a soma, pode utilizar o Group-Object e Cmdlets Measure-Object em esta abordagem brilhante sugerida no StackOverflow :

$userPSTs | Group-Object -Property MailboxName | Foreach-Object {
    New-Object PSObject -Property @{
        MailboxName = $_.MailboxName
        PSTsFound = ($_.Group | Measure-Object -Property PSTsFound -Sum).Sum
        Messagesremaining = ($_.Group | Measure-Object -Property Messagesremaining -Sum).Sum
    }
}
    
por 10.12.2013 / 18:46

Tags