求助:PowerShell行转列脚本(适配重复PC等特殊场景)
PowerShell 实现行转列(Open/Close 配对)
你的需求是将按时间顺序的State记录转换为PC的Open/Close配对行,需要处理同一PC的多组启停、缺失Close的记录,以及舍弃只有Close的记录。原脚本按PC分组无法区分多组启停,因此需要调整逻辑,以下是解决方案:
# 假设 $data 是已导入的原始数据(比如从CSV读取或预定义的对象数组) # 先按PC和时间排序,确保处理顺序符合时间先后 $sortedData = $data | Sort-Object PC, Time # 用于跟踪未配对的Open记录 $openEntries = @{} $result = @() foreach ($entry in $sortedData) { switch ($entry.State) { 'Open' { # 将当前Open记录存入字典,等待后续Close配对 $openEntries[$entry.PC] = $entry } 'Close' { # 检查是否有对应PC的未配对Open记录 if ($openEntries.ContainsKey($entry.PC)) { $openRecord = $openEntries[$entry.PC] # 生成配对后的结果行 $result += [pscustomobject]@{ PC = $openRecord.PC Open = $openRecord.Time Close = $entry.Time } # 移除已完成配对的Open记录 $openEntries.Remove($entry.PC) } # 无对应Open的Close记录(如PC5)直接跳过,不加入结果 } } } # 处理剩余未配对的Open记录(如PC4) foreach ($pc in $openEntries.Keys) { $openRecord = $openEntries[$pc] $result += [pscustomobject]@{ PC = $openRecord.PC Open = $openRecord.Time Close = $null } } # 格式化输出结果 $result | Format-Table -AutoSize
关键逻辑说明
- 排序处理:先按PC和时间排序,确保Open和对应的Close能按时间顺序正确配对。
- 未配对跟踪:用字典
$openEntries暂存每个PC的未完成Open记录,遇到Close时立即配对并移除字典中的对应记录。 - 边缘场景处理:
- 仅存在Close的记录(如PC5):因找不到对应Open,直接跳过不输出。
- 仅存在Open的记录(如PC4):遍历结束后,字典中剩余的记录单独生成结果行,Close字段留空。
- 同一PC多组启停(如PC1的两次Open/Close):每次配对后清空对应PC的暂存记录,新的Open会重新存入字典等待下一次Close配对。
运行后将得到你期望的输出:
PC Open Close ---- ---- ----- PC1 00:09:16 00:09:21 PC2 00:09:48 00:20:08 PC3 00:12:50 00:15:14 PC4 00:12:50 PC1 00:13:42 00:22:24
内容的提问来源于stack exchange,提问作者Алдар
相关产品推荐
相关产品推荐

