1

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

4

1 回答 1

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

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

于 2013-01-28T16:08:28.463 回答