Powershell - Import-CSV Group-Object 对分组 objects 中的数字求和,然后将所有分组的 objects 合并为单行
Powershell - Import-CSV Group-Object SUM a number from grouped objects and then combine all grouped objects to single rows
我有一个与此类似但有所不同的问题:
我的文件有 42 个现有 headers。分隔符是一个标准的逗号,并且在这个文件中没有引号。
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" 的总和相加,只查找找到的重复项,然后对我们刚刚求和的任何行进行合并在。来自 dupes 的总和值应该替换我们组合行中的 cur
值。
话虽如此,我们的 out-put 应该是这样的。
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
现在我们已经解决了这个问题,这就是这个问题的不同之处。我想在 out-put 文件中完整保留所有 42 列。在我上面提到的另一个问题中,输入是 5 列,out-put 是 4 列,这不是我想要实现的。我还有很多 headers,我不想单独指定所有 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 值的总和, 在当前领域。
最后更新: 尝试了 Rich 的解决方案,但出现错误。修改了他对此的内容 $dupesGrouped = $revCSV | Group-Object master_account_number | Select-Object Name, @{Name='curSum'; Expression={ ($_.Group | Measure-Object cur -Sum).Sum}}
这正是我自己的代码带给我的,所以我仍在寻找解决方案。我需要用所有 42 headers 输出这个 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,
}
你很接近,但你使用了 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
哈希表来添加其他字段。我假设您想要 select 第一次出现相同的姓氏 master_account_number。如果同一个 master_account_number 的姓氏不同,输出将不正确。
在只改变部分数据的情况下,还有如下方式
$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
}
我有一个与此类似但有所不同的问题:
我的文件有 42 个现有 headers。分隔符是一个标准的逗号,并且在这个文件中没有引号。
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" 的总和相加,只查找找到的重复项,然后对我们刚刚求和的任何行进行合并在。来自 dupes 的总和值应该替换我们组合行中的 cur
值。
话虽如此,我们的 out-put 应该是这样的。
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
现在我们已经解决了这个问题,这就是这个问题的不同之处。我想在 out-put 文件中完整保留所有 42 列。在我上面提到的另一个问题中,输入是 5 列,out-put 是 4 列,这不是我想要实现的。我还有很多 headers,我不想单独指定所有 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 值的总和, 在当前领域。
最后更新: 尝试了 Rich 的解决方案,但出现错误。修改了他对此的内容 $dupesGrouped = $revCSV | Group-Object master_account_number | Select-Object Name, @{Name='curSum'; Expression={ ($_.Group | Measure-Object cur -Sum).Sum}}
这正是我自己的代码带给我的,所以我仍在寻找解决方案。我需要用所有 42 headers 输出这个 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,
}
你很接近,但你使用了 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
哈希表来添加其他字段。我假设您想要 select 第一次出现相同的姓氏 master_account_number。如果同一个 master_account_number 的姓氏不同,输出将不正确。
在只改变部分数据的情况下,还有如下方式
$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
}