You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell按Section和Username筛选最新LastSub时间戳行

问题:筛选CSV中每个Section和Username组合的最新LastSub记录

我有一个包含多列的大型CSV文件,需提取Section、GradeItemID(对应示例中的Item)、LastSub、Username这4列,核心需求是筛选出每个Section和Username组合下最新的LastSub记录,其中LastSub为时间戳字段,每个Username对应多行数据。

原始数据示例

SectionItemLastSubUsername
AA18124961016289359/27/22 11:52am5220107
AA181249610162893510/12/22 10:00am5220107
AA18125361261615269/20/22 11:52am5220107
AA181253612616152610/14/22 10:53am5220107

期望输出结果

SectionItemLastSubUsername
AA181249610162893510/12/22 10:00am5220107
AA181253612616152610/14/22 10:53am5220107

尝试过程中的问题

第一次尝试代码及报错

尝试提取所需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

代码说明

  1. 通过Import-Csv读取文件并指定表头,过滤空行和LastSub为空的记录,提取所需4列;
  2. 先按Section分组,再在每个Section组内按Username二次分组;
  3. 对每个Section+Username的子组,结合Get-Date将LastSub转为时间戳后降序排序,取第一条最新记录;
  4. 最终将结果导出为带日期后缀的CSV文件。

内容的提问来源于stack exchange,提问作者MJB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:25:22