powershell - 按日期获取最新值
问题描述
我有按日期排序的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 机智价值?
解决方案
这似乎做了你想要的。[咧嘴笑]
唯一有点奇怪的是……
- “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
就个人而言,我会认真考虑保留每个项目的日期。
推荐阅读
- c# - .NET Core WebAPI VueJS 模板发布问题
- android - 片段中的recyclerView水平问题
- android - 如何将 Genymotion 连接到 Android Studio 版本 3.5.3?
- flutter-web - 如何使用 Codemagic CI 构建和发布 Flutter Web 项目?
- vue.js - VueJS 路由器:确定第一个页面加载以禁用/更改页面转换
- python - 挑战任务以使用函数 find() 和 set()
- class - 继承类扩展
- php - 为什么 Formidable Pro 中的 PHP/MySQL COUNT 不工作?
- node.js - 使用 Express 对 Twitter 帐户进行身份验证时传递类似状态的数据
- swift - 使用主队列中的 Dispatch 一次调用一个函数