首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对psobject中的单个数组属性进行排序

对psobject中的单个数组属性进行排序
EN

Stack Overflow用户
提问于 2022-08-10 14:54:02
回答 2查看 25关注 0票数 0

我有下面的psobject (从csv进口),这是原始的,

代码语言:javascript
复制
Computer Name    : CompName
Date             : 10/26/2020
                   7/1/2021
                   3/6/2019
                   7/13/2022
                   3/6/2019
                   2/7/2021
                   10/13/2020
                   2/7/2021
                   2/7/2021
                   7/1/2021
                   10/13/2020
IP Address       : 127.0.0.1
OS               : Win10 10.0.17763.1282 (1809)
CPU              : 2600 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 09:54:51 +0000

Computer Name    : CompName2
Date             : 2/10/2021
                   6/24/2021
                   3/6/2019
                   3/6/2019
                   2/12/2021
                   2/9/2021
                   2/9/2021
                   6/24/2021
                   2/10/2021
IP Address       : 127.0.0.2
OS               : Win10 10.0.17763.973 (1809)
CPU              : 2700 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 11:38:34 +0000

我想对日期进行排序,并在单个对象中获取最后一个日期。这意味着这是最后一次通缉。

代码语言:javascript
复制
Computer Name    : CompName
Date             : 7/13/2022
IP Address       : 127.0.0.1
OS               : Win10 10.0.17763.1282 (1809)
CPU              : 2600 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 09:54:51 +0000

Computer Name    : CompName2
Date             : 6/24/2021
IP Address       : 127.0.0.2
OS               : Win10 10.0.17763.973 (1809)
CPU              : 2700 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 11:38:34 +0000

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2022-08-10 15:04:36

让我们首先来看看我们如何能够首先对单个值执行此操作。

Import-Csv将生成一个多行字符串:

代码语言:javascript
复制
$dates = @'
10/26/2020
7/1/2021
3/6/2019
7/13/2022
3/6/2019
2/7/2021
10/13/2020
2/7/2021
2/7/2021
7/1/2021
10/13/2020
'@

在对单个日期字符串进行有意义的排序之前,我们需要将它们拆分为多个字符串:

代码语言:javascript
复制
$dates -split '\r?\n'

在此之后,我们可以要求Sort-Object将每个字符串作为一个[datetime]值来获得正确的排序顺序:

代码语言:javascript
复制
$datesSorted = $dates -split '\r?\n' |Sort-Object { [datetime]::ParseExact($_, 'd/M/yyyy', $null) } -Descending

最后,只获取第一个值,得到最大/最新的值:

代码语言:javascript
复制
$datesSorted |Select-Object -First 1

现在我们已经知道如何从单个Date属性中获得正确的行了,我们可以将其放在一起并使用ForEach-Object语句修改每个对象:

代码语言:javascript
复制
$csvData |ForEach-Object {
    $_.Date = $_.Date -split '\r?\n' |Sort-Object {[datetime]::ParseExact($_, 'd/M/yyyy', $null)} -Descending |Select -First 1
}

存储在$csvData中的对象现在都按照需要修改了它们的Date属性值。

票数 0
EN

Stack Overflow用户

发布于 2022-08-10 15:22:55

我只是重新读了你的帖子。你的进口- CMDLET是什么样子的?默认情况下,CSV不导入多维数组。如何在CSV文件中格式化日期列?您还有两个对象,所以我假设这是一个我们正在处理的数组。

最初的答复:

只要日期属性是字符串数组,这将在单个对象或数组上工作。

这将保留日期数组,以防其他事情需要它,并添加一个额外的属性"RecentDate“。

代码语言:javascript
复制
$simpleArray=$simpleArray | Select *, @{N="RecentDate";e={$_.Date | sort | select -last 1}}
代码语言:javascript
复制
$dates1 = "10/26/2020
7/1/2021
3/6/2019
7/13/2022
3/6/2019
2/7/2021
10/13/2020
2/7/2021
2/7/2021
7/1/2021
10/13/2020" -split("`n")
$dates1=$dates1.trim()

$dates2 = "2/10/2021
6/24/2021
3/6/2019
3/6/2019
2/12/2021
2/9/2021
2/9/2021
6/24/2021
2/10/2021" -split("`n")
$dates2=$dates2.trim()

$obj1 = [pscustomobject]@{'Computer name'="CompName"
    Date=$dates1
    'IP Address'="127.0.0.2"
    OS="Win10 10.0.17763.973 (1809)"
    CPU="2700 MHz Core i5-6500T"
    'Last Report Time'="Wed, 1 Aug 2022 11:38:34 +0000"
}

$obj2 = [pscustomobject]@{'Computer name'="CompName2"
    Date=$dates2
    'IP Address'="127.0.0.2"
    OS="Win10 10.0.17763.1282 (1809)"
    CPU="2700 MHz Core i5-6500T"
    'Last Report Time'="Wed, 1 Aug 2022 09:54:51 +0000"
}

$simpleArray = New-Object -TypeName 'System.Collections.ArrayList';
$null=$simpleArray.add($obj1)
$null=$simpleArray.add($obj2)

输出:

代码语言:javascript
复制
Computer name    : CompName
Date             : {10/26/2020, 7/1/2021, 3/6/2019, 7/13/2022...}
IP Address       : 127.0.0.2
OS               : Win10 10.0.17763.973 (1809)
CPU              : 2700 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 11:38:34 +0000
RecentDate       : 7/13/2022

Computer name    : CompName2
Date             : {2/10/2021, 6/24/2021, 3/6/2019, 3/6/2019...}
IP Address       : 127.0.0.2
OS               : Win10 10.0.17763.1282 (1809)
CPU              : 2700 MHz Core i5-6500T
Last Report Time : Wed, 1 Aug 2022 09:54:51 +0000
RecentDate       : 6/24/2021
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73308468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档