【问题标题】:Powershell - Import-CSV Group-Object SUM a number from grouped objects and then combine all grouped objects to single rowsPowershell - Import-CSV Group-Object SUM 来自分组对象的数字,然后将所有分组对象组合到单行
【发布时间】:2019-12-01 19:59:43
【问题描述】:

我有一个与此类似的问题,但有一点不同: Powershell Group Object in CSV and exporting it

我的文件有 42 个现有标题。分隔符是标准逗号,此文件中没有引号。

master_account_number,sub,txn,cur,last,first,address,address2,city,state,zip,ssn,credit,email,phone,cell,workphn,dob,chrgnum,cred,max,allow,neg,plan,downpayment,pmt2,min,clid,cliname,owner,merch,legal,is_active,apply,ag,offer,settle_perc,min_pay,plan2,lstpmt,orig,placedate

文件的数据(前 6 列)如下所示:

master_account_number,sub,txn,cur,last,first
001,12,35,50.25,BIRD, BIG
001,34,47,100.10,BIRD, BIG
002,56,9,10.50,BUNNY, BUGS
002,78,3,20,BUNNY, BUGS
003,54,7,250,DUCK, DAFFY
004,44,88,25,MOUSE, JERRY

我只处理第一列master_account_number 和第四列cur。 我想检查“master_account_number”列的重复项,如果找到,然后将第 4 列“cur”的总数相加,仅针对找到的那些重复项,然后对我们刚刚进行总和的任何行进行合并。来自骗子的总和值应该替换我们组合行中的cur 值。

话虽如此,我们的输出应该是这样的。

master_account_number,sub,txn,cur,last,first
001,12,35,150.35,BIRD, BIG
002,56,9,30.50,BUNNY, BUGS
003,54,7,250,DUCK, DAFFY
004,44,88,25,MOUSE, JERRY

现在我们已经解决了这个问题,这就是这个问题的不同之处。我想在输出文件中保持所有 42 列不变。在我上面提到的另一个问题中,输入是 5 列,输出是 4 列,这不是我想要实现的。我有更多的标题,我不想单独指定所有 42 列。无论如何,这似乎效率低下。

至于我目前掌握的代码……不多。

$revNB = "\\server\path\example.csv"
$global:revCSV = import-csv -Path $revNB | ? {$_.is_active -eq "Y"}
$dupesGrouped = $revCSV | Group-Object master_account_number | Select-Object @{Expression={ ($_.Group|Measure-Object cur -Sum).Sum }}

最终我希望输出看起来与输入相同,只有输出应该合并重复的帐号行,并在 cur 中添加所有“cur”值,其中合并的行包含分组 cur 值的总和场地。

上次更新:尝试了 Rich 的解决方案,但出现错误。修改了他对此$dupesGrouped = $revCSV | Group-Object master_account_number | Select-Object Name, @{Name='curSum'; Expression={ ($_.Group | Measure-Object cur -Sum).Sum}} 的内容 这让我得到了我自己的代码让我得到的东西,所以我仍在寻找解决方案。我需要用所有 42 个标题输出这个 CSV。即使对于没有重复的项目。

我尝试过的其他方法: 这并没有给我列中需要的数据,列在那里但它们是空白的。

$dupesGrouped = $revCSV | Group-Object master_account_number | Select-Object @{ expression={$_.Name}; label='master_account_number' },
sub_account_number,
charge_txn,
@{Name='current_balance'; Expression={ ($_.Group | Measure-Object current_balance -Sum).Sum },
last,
}

【问题讨论】:

    标签: powershell csv export-csv measure-object


    【解决方案1】:

    您已经很接近了,但您使用了current_balance,您可能指的是cur。

    这是一个开始:

    $dupesGrouped = $revCSV | Group-Object master_account_number |  
    Select-Object Name, @{N='curSum'; E={ ($_.Group | Measure-Object cur -Sum).Sum}, 
    @{N='last'; E={ ($_.Group | Select-Object last -first 1).last} }
    

    您可以通过为要汇总的每个字段添加Name;Expression 哈希表来添加其他字段。我假设您希望为相同的 master_account_number 选择第一次出现的重复姓氏。如果相同 master_account_number 的姓氏不同,则输出将不正确。

    【讨论】:

    • 看起来很接近但由于错误而不起作用:Select-Object : The "E" key has a type, System.Object[], that is not valid; expected types are {System.String, System.Management.Automation.ScriptBlock}.
    • 另外,我并不关心保留哪些重复行,但我希望“curSum”在合并后进入“cur”字段。之后我不再进行分组。
    • 我无法重现您的错误。你的 Powershell 版本是什么? $PSVersionTable
    • 现在是 5.1 版
    • 由于分组后数据的结构发生了变化,所以必须从组中进行选择。 42 列中的每一列都需要它自己的 N/E 块:@{N='sub'; E={ ($_.Group | Select-Object sub -first 1).sub} }, @{N='txn'; E={ ($_.Group | Select-Object txn -first 1).txn} } 可能有更简单的方法,但我不知道。
    【解决方案2】:

    在只改变部分数据的情况下,还有如下方式。

    $dupesGrouped = $revCSV | Group-Object master_account_number | ForEach-Object {
    
        # copy the first data in order not to change original data
        $new = $_.Group[0].psobject.Copy()    
    
        # update the value of cur property
        $new.cur = ($_.Group | Measure-Object cur -Sum).Sum
    
        # output
        $new                                  
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 2017-04-17
      • 2020-09-16
      • 1970-01-01
      • 2011-03-14
      • 2021-11-21
      • 2020-06-06
      • 2021-04-21
      相关资源
      最近更新 更多