Windows Powershell排序和筛选器

Windows Powershell排序和筛选器,windows,sorting,powershell,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=$fal

我有一个包含详细数据的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对象调用将取每列的第一行。但是,使用-unique开关排序对象似乎会选择一个随机行,而不是第一行。因此,对于每个AB组合,这确实会得到一行,但不是与最近的C对应的一行


有改进的建议吗?数据集非常大,因此逐行查看文件很麻烦,因此希望使用powershell解决方案。

您应该查看
分组依据。我没有创建一个示例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

这将返回与输入的列相同的列(datetime从输出中排除)。

看起来很接近,但它只显示了A、B、C三列,而没有显示其他列。我试图在D、E等列中找到最新的C(确实如此)行。请尝试更新后的答案。如果不起作用,您能否提供一个带有确切列数和一些示例数据的示例csv?:-)那很好。非常感谢。我可以要求一个小小的附加功能吗?如果我想为ColumnD做一个小计,可以很容易地添加吗。因此,输出将显示ColumnA、ColumnB grouped、最新的日期时间ColumnC、所有其他列,以及作为附加字段的ColumnD总数(在A和B与特定组匹配的地方求和,即我们要查找最新列C的相同子集)。完成。为每个组添加了一列“SumD”,显示所有“组成员”的列数总和。