csv中最后一次重复

时间:2017-01-30 16:47:30

标签: powershell csv

我有一个csv输入文件,如:

  

日期;时间; PC;状态

     

2017年1月25日; 10:30:57; PC1;非活性

     

2017年1月25日; 10:35:57; PC2;活性

     

2017年1月25日; 10:37:34; PC1;活性

     

2017年1月25日; 10:38:35; PC3;非活性

     

2017年1月25日; 10:39:20; PC1;非活性

     

2017年1月25日; 10:42:10; PC2;非活性

     

2017年1月25日; 10:42:10; PC3;活性

所以,我需要只显示最后一次重复非活动状态,并显示时间和当前时间之间的差异。 结果必须是:

  

pc1从10:39:20不活动

     

pc2从10:42:10不活动

不知道如何在powershell中实现它。需要帮助:)

2 个答案:

答案 0 :(得分:1)

现在,您只需通过Write-Host输出它,但您应该可以重建它以处理您想要的数据:

$csv = import-csv .\test.csv -Delimiter ";"
$pcs = $csv.pc | select -Unique
foreach($pc in $pcs) {

#get all entries for current pc and order by date/time, then select newest entry
$le = $csv | where {$_.pc -eq $pc} | sort date,time -Descending | select -First 1

#if last state is inactive
if($le.state -eq "inactive"){
    $writedate = get-date -Date $le.date -Hour $le.time.Substring(0,2) -Minute $le.time.Substring(3,2) -Second $le.time.Substring(6,2)
    $td = (get-date) - $writedate
    write-host "time difference for $pc : $($td.Days) days $($td.Hours) hours, $($td.Minutes) minutes, $($td.Seconds) seconds"
}

}

如果您的时间字段不是HH:MM:DD,那么您将不得不更改脚本以适应

答案 1 :(得分:0)

两个解决方案,一个简短的解决方案:

$csv = import-csv .\SO_41941150.csv -Delimiter ";"
$csv|group pc|%{$_.group|select -last 1|? state -eq 'inactive'|%{"$($_.pc) inactive from $($_.time)"}}

准确输出:

pc1 inactive from 10:39:20
pc2 inactive from 10:42:10

使用:: ParseExact将日期和时间转换为日期时间的较长时间,并将结果显示为经过的TotalSeconds / Minutes。

$csv = import-csv .\SO_41941150.csv -Delimiter ";"
$csv | Group-Object pc | Foreach-Object {
  $_.Group | Select-Object -last 1 | Where-Object state -eq 'inactive'|
  ForEach-Object {
    $DT = [datetime]::ParseExact("$($_.date) $($_.time)","dd.MM.yyyy HH:mm:ss",$null)
    $Secs = [int]((get-date) - $DT).TotalSeconds
    $mins = [int]((get-date) - $DT).TotalMinutes
    "$($_.pc) inactive since $Mins minutes or $Secs seconds"
  }
}

输出:

pc1 inactive since 9160 minutes or 549578 seconds
pc2 inactive since 9157 minutes or 549408 seconds