我正在尝试找到一种方法,可以按两个字段对CSV排序并仅检索最新的项目。
CSV字段:时间,计算机,类型,域。
有效的项目在下方,但由于CSV的规模而变慢,我觉得有更好的方法。
$sorted = $csv | Group-Object {$_.computer} | ForEach {$_.Group | Sort-Object Time -Descending | Select-Object -First 1}
答案 0 :(得分:0)
正如Lee_Dailey所建议的那样,使用hashtable
可能会带来更好的运气,相反,Group-Object
(除非与-NoElement
参数一起使用)非常慢且需要大量内存。
最快的方式是这样的:
# use the call operator & instead of ForEach-Object to avoid overhead from pipeline parameter binding
$csv |&{
begin{
# create a hashtable to hold the newest object per computer
$newest = @{}
}
process{
# test if the object in the pipeline is newer that the one we have
if(-not $newest.ContainsKey($_.Computer) -or $newest[$_.Computer].Time -lt $_.Time){
# update our hashtable with the newest object
$newest[$_.Computer] = $_
}
}
end{
# return the newest-per-computer object
$newest.Values
}
}