Powershell排序和过滤

时间:2013-01-28 15:32:29

标签: windows sorting powershell

我有一个包含详细数据的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解决方案。

1 个答案:

答案 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

返回输入的相同列(日期时间从输出中排除)。