PowerShell按Section和Username筛选最新LastSub时间戳行
问题:筛选CSV中每个Section和Username组合的最新LastSub记录
我有一个包含多列的大型CSV文件,需提取Section、GradeItemID(对应示例中的Item)、LastSub、Username这4列,核心需求是筛选出每个Section和Username组合下最新的LastSub记录,其中LastSub为时间戳字段,每个Username对应多行数据。
原始数据示例
| Section | Item | LastSub | Username |
|---|---|---|---|
| AA181249 | 6101628935 | 9/27/22 11:52am | 5220107 |
| AA181249 | 6101628935 | 10/12/22 10:00am | 5220107 |
| AA181253 | 6126161526 | 9/20/22 11:52am | 5220107 |
| AA181253 | 6126161526 | 10/14/22 10:53am | 5220107 |
期望输出结果
| Section | Item | LastSub | Username |
|---|---|---|---|
| AA181249 | 6101628935 | 10/12/22 10:00am | 5220107 |
| AA181253 | 6126161526 | 10/14/22 10:53am | 5220107 |
尝试过程中的问题
第一次尝试代码及报错
尝试提取所需4列并过滤LastSub非空行,代码如下:
Import-Csv "F:\TLGDRIVE\Schoology Grade Check\Inbound Submissions Date\rawdata\test3.csv" -Header 'SectNID','SectSchCode','SIS','GraPer','GradeItemID','LastSub','Username','School' | Where {$_} | Where {$_.LastSub -ne ''} | select -Property 'SectSchCode','GradeItemID','LastSub','Username' Foreach-Object {$_.LastSub = [nullable[DateTime]]$_.LastSub; $_}
执行后出现错误:
The property 'LastSub' cannot be found on this object. Verify that the property exists and can be set.
At line:2 char:17
- Foreach-Object {$.LastSub = [nullable[DateTime]]$.LastSub; $_}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : InvalidOperation: (:) [], RuntimeException
- FullyQualifiedErrorId : PropertyNotFound
错误原因:Foreach-Object未接到前一条管道的输出,前一条命令结束后未传递结果,导致无法找到LastSub属性。
第二次尝试代码及问题
尝试转换时间戳并分组筛选,代码如下:
Foreach-Object {$_.LastSub = [DateTime]$_.LastSub; $_} Group-Object Username | Foreach-Object {$_.Group | Sort-Object 'LastSub' | Select-Object -Last 1} | Export-Csv
执行时遇到空行报错,且仅按Username分组未考虑Section,不符合需求。
最终可用代码
Import-Csv "F:\TLGDRIVE\Schoology Grade Check\Inbound Submissions Date\rawdata\test3.csv" -Header 'SectNID','Section','SIS','GraPer','GradeItemID','LastSub','Username','School' | Where {$_} | Where {$_.LastSub -ne ''} | select -Property 'Section','GradeItemID','LastSub','Username' | Group-Object Section | ForEach-Object { foreach($group in $_.Group | Group-Object Username) { $group.Group | Sort-Object { Get-Date $_.LastSub } -Descending | Select-Object -First 1 } } | Export-Csv "F:\TLGDRIVE\Schoology Grade Check\Inbound Submissions Date\submissions $(get-date -f yyyy-MM-dd).csv" -NoTypeInformation
代码说明
- 通过
Import-Csv读取文件并指定表头,过滤空行和LastSub为空的记录,提取所需4列; - 先按
Section分组,再在每个Section组内按Username二次分组; - 对每个Section+Username的子组,结合
Get-Date将LastSub转为时间戳后降序排序,取第一条最新记录; - 最终将结果导出为带日期后缀的CSV文件。
内容的提问来源于stack exchange,提问作者MJB
相关产品推荐
相关产品推荐

