按日期获取最新值

时间:2019-02-19 18:14:19

标签: powershell sorting import-csv

我按日期将csv排序为:

15.02.2019;pc1;5;
15.02.2019;pc2;0;
16.02.2019;pc3;2;
16.02.2019;pc1;0;
17.02.2019;pc2;2;
18.02.2019;pc1;0;
18.02.2019;pc1;1;
18.02.2019;pc2;1;

我想按日期更新具有价值的PC。必须是这样的:

pc2;1
pc1;1
pc3;2

我的代码:

$info=Import-Csv 'my_file.txt' -Header date,pc,value -Delimiter ';'
$deadline = (Get-Date).AddDays(-30)
$datas=$info | Where-Object {($_."date" -as [DateTime]) -gt $deadline} | Sort-Object {$_."date" -as [DateTime]} -Descending| Sort-Object -property pc -unique

,输出为:

date       pc  value
----       --  -----
18.02.2019 pc1 0    
18.02.2019 pc2 1    
16.02.2019 pc3 2    

我如何获得第一个最新的PC机智值?

1 个答案:

答案 0 :(得分:0)

这似乎可以满足您的要求。 [咧嘴]

唯一有点奇怪的是...

  • “伪造CSV文件中的内容”
    只是为了获取样本数据而无需创建文件。
  • 使用Group-Object通过.PC属性值对项目进行聚类

这是代码...

# fake reading in a CSV file
#    in real life, use Import-CSV
$InStuff = @'
15.02.2019;pc1;5;
15.02.2019;pc2;0;
16.02.2019;pc3;2;
16.02.2019;pc1;0;
17.02.2019;pc2;2;
18.02.2019;pc1;0;
18.02.2019;pc1;1;
18.02.2019;pc2;1;
'@ | ConvertFrom-Csv -Delimiter ';' -Header Date, PC, Value

$EU_DatePattern = 'dd.MM.yyyy'
$Deadline = [datetime]::Now.Date.AddDays(-30)

$Results = $InStuff |
    ForEach-Object {
        # my date format is yyyy-MM-dd, so the "-as [datetime]" fails
        $_.Date = [datetime]::ParseExact($_.Date, $EU_DatePattern, $Null)
        $_
        } |
    Where-Object {
        $_.Date -gt $Deadline
        } |
    Sort-Object -Property Date, Value |
    Group-Object -Property PC |
    ForEach-Object {
        [PSCustomObject]@{
            PC = $_.Name
            # the very last item in the ".Group" array will be
            #    - the newest
            #    - have the highest ".Value"
            Value = $_.Group[-1].Value
            }
        }

$Results

输出...

PC  Value
--  -----
pc2 1    
pc1 1    
pc3 2    

就个人而言,我会认真考虑保留每个项目的日期。