The -SUM parameter in Measure-object

Welcome Forums General PowerShell Q&A The -SUM parameter in Measure-object

This topic contains 5 replies, has 2 voices, and was last updated by

 
Participant
2 months, 3 weeks ago.

  • Author
    Posts
  • #108950

    Participant
    Points: 109
    Rank: Participant

    Is there a way to sum (i.e., total) the values of a specific property by "sub-groups" of objects in a CSV file?  An example is best.  The CSV file looks like the ff:

    ID,   Amount

    10,   110

    10,   40

    12 ,  50

    12,   40

    12 ,  10

    ...

    I'd like to create a file that looks like:

    10,150

    12,100

    ...

    I did it by looping through each object with Foreach ... using the $_ cursor and additional variables to keep track of the changes.

    I also thought Measure-object's -SUM could do the job, but it seems it can only sum the CSV file's Amount property.  I'm looking for a "Powershell way" to use existing cmdlets and pipeline processing.

    Would be grateful for any hints, suggestions, tips.

  • #108953

    Participant
    Points: 527
    Helping Hand
    Rank: Major Contributor

    Group-Object is your hero here.

    #CSV data
    id value
    — —–
    10 110
    10 40
    12 50
    12 40
    12 10

    $Data = Import-Csv -Path c:\Temp\Test.csv
    $Data | Group-Object -Property id | ForEach-Object -Process {
        $Sum = $_.group | measure -sum -Property Value
        [pscustomobject]@{id=$_.Name ; value = $Sum.sum}
       
        #if the PowerShell version is 2.0, then below code has to be used instead of [PSCustomObject] way
        New-Object -TypeName PSObject -Property @{id=$_.Name ; value = $Sum.sum}
    }
    • #108956

      Participant
      Points: 109
      Rank: Participant

      Many thanks, Mr kvprasoon.  Much appreciated!

    • #108959

      Participant
      Points: 109
      Rank: Participant

      Hello Mr kvprasoon,

      I touched up the code you recommended and got the message:

      ForEach-Object : Missing an argument for parameter 'Process'. Specify a parameter of type
      'System.Management.Automation.ScriptBlock[]' and try again.

      It seems there is a syntax error somewhere in the line:  Foreach -process.

      Also, I'm not clear on what the line

      [PSCustomobject]@{id=$_.Name; value = $Sum.sum}

      does.  Looks like a hahs table, but am unclear on what it does.

      Thanking you in advance.

  • #108962

    Participant
    Points: 527
    Helping Hand
    Rank: Major Contributor

    Seems like some issue occurred when you copied directly from the web. Process is a parameter for ForEach-Object cmdlet which accepts scriptblock.

    About PSCustomObject, here is a great blog post about it by Kevin

    • #108968

      Participant
      Points: 109
      Rank: Participant

      Very well, Mr. kvprasoon.

      I retyped the code just to be sure, and it works beautifully.

      Thanks also for the article about [PSCustomObject], it was very informative and useful to my learning Powershell.

      Many thanks.

You must be logged in to reply to this topic.