Получить последнее значение по дате - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть 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;

Я хочу получить последний по дате ПК со значением.Должно быть так:

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    

Как я могу получить первое новейшее значение ПК с остроумием?

1 Ответ

0 голосов
/ 19 февраля 2019

это похоже на то, что вы хотите.[ ухмылка ]

единственное, что немного странно, это ...

  • "поддельное чтение в файле 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

output ...

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

лично, я бы серьезно подумал о сохранении даты, чтобы идти с каждым элементом.

...