1

我有一个与此类似的问题,但有一点不同: CSV 中的 Powershell Group Object 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,
}
4

2 回答 2

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 的姓氏不同,则输出将不正确。

于 2019-07-23T19:25:06.003 回答
0

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

$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                                  
}
于 2019-07-24T11:48:51.263 回答