windows - 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=$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 解决方案。

最佳答案

您应该查看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

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

关于windows - Powershell 排序和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14565412/

相关文章:

c# - 仅获取第一级子目录 C#

powershell - "Media created"的变量? (电源外壳)

java - 确定Java程序的输入源

c - 将 offsetof 与 enum 一起使用不会在 Visual Studio 2015 中编译

c - 在 C 中优化 'sorting code'

Powershell WebAdministration 迭代给定 IIS 站点的应用程序/虚拟目录

windows - 如何在Windows XP Embedded(未安装Sc.exe)上创建服务?

.net - 在辅助显示器上全屏显示

python - Pandas:按两个参数分组并按第三个参数排序

java - 使用java中的冒泡排序查找数组中第一个第二大的数字及其位置