我有一个包含详细数据的csv文件,比如列A,B,C,D等。列A和B是类别,C是时间戳。
我正在尝试创建一个摘要文件,为A和B的每个组合显示一行。它应该从原始数据中选择行,其中C是最近的日期。
以下是我尝试解决问题的方法。
Import-CSV InputData.csv | `
Sort-Object -property @{Expression="ColumnA";Descending=$false}, `
@{Expression="ColumnB";Descending=$false}, `
@{Expression={[DateTime]::ParseExact($_.ColumnC,"dd-MM-yyyy HH:mm:ss",$null)};Descending=$true} | `
Sort-Object ColumnA, ColumnB -unique `
| Export-CSV OutputData.csv -NoTypeInformation
首先读取文件,然后按所有3列对所有内容进行排序,然后第二个Sort-Object调用将采用每个列的第一行。但是,使用-unique开关的Sort-Object似乎选择一个随机行,而不是第一行。因此,对于每个AB组合,这确实得到一行,但不是对应于最近的C的那一行。
有任何改进建议吗?数据集非常大,因此逐行浏览文件很笨拙,所以更喜欢PowerShell解决方案。
答案 0 :(得分:3)
您应该查看Group-By
。我没有创建一个示例CSV(您应该提供它:-))所以我没有对此进行测试,但我认为它应该可行:
Import-CSV InputData.csv | `
Select-Object -Property *, @{Label="DateTime";Expression={[DateTime]::ParseExact($_.ColumnC,"dd-MM-yyyy HH:mm:ss",$null)}} | `
Group-Object ColumnA, ColumnB | `
% {
$sum = ($_.Group | Measure-Object -Property ColumnD -Sum).Sum
$_.Group | Sort-Object -Property "DateTime" -Descending | Select-Object -First 1 -Property *, @{name="SumD";e={ $sum } } -ExcludeProperty DateTime
} | Export-CSV OutputData.csv -NoTypeInformation
返回输入的相同列(日期时间从输出中排除)。