根据每个元素中的部分内容对 PowerShell 数组进行排序

Sort an PowerShell array according to a part of content in each element

我正在使用 powershell 脚本,其中有一个包含以下数据的数组。下面的每一行都是数组中的一个元素。

每个元素都有两个部分,由“/”分隔,一个数字(可以是 1-12 位数字)和一个日期时间。

我需要根据每个元素中给出的日期和时间对数组进行排序。

201410212339/21-Oct-2014 23:50 -
2251/27-Sep-2014 23:02 -
0436/22-Oct-2014 04:47 -
091342/09-Oct-2014 13:53 -
2220743/22-Oct-2014 07:53 -
20140/22-Sep-2014 07:41 -
2190446/19-Oct-2014 04:56 -
2014258/21-Aug-2014 23:21 -
22110/22-Oct-2014 14:21 -
1410221721/22-Jun-2014 17:33 -
130/23-Jul-2014 11:42 -
10231426/23-Feb-2014 14:38 -
231731/23-Jan-2014 17:43 -
0232039/23-Mar-2014 20:51 -

谁能帮我解决这个问题?我想对数组进行排序以访问最新的或第二个最新的条目并使用与之关联的数字。我可以尝试将每个元素拆分为数字和日期时间并对它们进行排序,但我正在寻找一种更简单的方法。

提前致谢。

您可以从每个字符串创建属性,按一个排序,然后重新展开原来的...类似于:

@"
201410212339/21-Oct-2014 23:50 -
2251/27-Sep-2014 23:02 -
0436/22-Oct-2014 04:47 -
091342/09-Oct-2014 13:53 -
2220743/22-Oct-2014 07:53 -
20140/22-Sep-2014 07:41 -
2190446/19-Oct-2014 04:56 -
2014258/21-Aug-2014 23:21 -
22110/22-Oct-2014 14:21 -
1410221721/22-Jun-2014 17:33 -
130/23-Jul-2014 11:42 -
10231426/23-Feb-2014 14:38 -
231731/23-Jan-2014 17:43 -
0232039/23-Mar-2014 20:51 -
"@ -split "`r`n"|Select @{l='SortMe';e={[int64]$_.split('/')[0]}},@{l='Value';e={$_}}|sort SortMe|Select -Expand Value

那将输出:

130/23-Jul-2014 11:42 -
0436/22-Oct-2014 04:47 -
2251/27-Sep-2014 23:02 -
20140/22-Sep-2014 07:41 -
22110/22-Oct-2014 14:21 -
091342/09-Oct-2014 13:53 -
231731/23-Jan-2014 17:43 -
0232039/23-Mar-2014 20:51 -
2014258/21-Aug-2014 23:21 -
2190446/19-Oct-2014 04:56 -
2220743/22-Oct-2014 07:53 -
10231426/23-Feb-2014 14:38 -
1410221721/22-Jun-2014 17:33 -
201410212339/21-Oct-2014 23:50 -

如果您不希望它们按数字排序并希望数字按字符串排序,请从中删除 [int64]

如果您想按日期和时间排序,这是一种方法。

这是你的数组数据

$data = @("201410212339/21-Oct-2014 23:50 -",
"2251/27-Sep-2014 23:02 -",
"0436/22-Oct-2014 04:47 -",
"091342/09-Oct-2014 13:53 -",
"2220743/22-Oct-2014 07:53 -",
"20140/22-Sep-2014 07:41 -",
"2190446/19-Oct-2014 04:56 -",
"2014258/21-Aug-2014 23:21 -",
"22110/22-Oct-2014 14:21 -",
"1410221721/22-Jun-2014 17:33 -",
"130/23-Jul-2014 11:42 -",
"10231426/23-Feb-2014 14:38 -",
"231731/23-Jan-2014 17:43 -",
"0232039/23-Mar-2014 20:51 -")

去掉每行末尾的多余字符

$data.replace(" -","")

刻度

中用[datetime]表示日期在每一行前
$data.replace(" -","") | % { [string]([datetime]::Parse($_.split("/")[1]).ticks) + "@" + $_}

排序

$data.replace(" -","") | % { [string]([datetime]::Parse($_.split("/")[1]).ticks) + "@" + $_} | sort-object

如果需要,删除前置日期字符串并恢复末尾的垃圾。

$data.replace(" -","") | % { [string]([datetime]::Parse($_.split("/")[1]).ticks) + "@" + $_} | sort-object | %{$_.split("@")[1] + " -"}

结果如下:

231731/23-Jan-2014 17:43 -
10231426/23-Feb-2014 14:38 -
0232039/23-Mar-2014 20:51 -
1410221721/22-Jun-2014 17:33 -
130/23-Jul-2014 11:42 -
2014258/21-Aug-2014 23:21 -
20140/22-Sep-2014 07:41 -
2251/27-Sep-2014 23:02 -
091342/09-Oct-2014 13:53 -
2190446/19-Oct-2014 04:56 -
201410212339/21-Oct-2014 23:50 -
0436/22-Oct-2014 04:47 -
2220743/22-Oct-2014 07:53 -
22110/22-Oct-2014 14:21 -

编辑:

我最初尝试按 [datetime] 排序没有正常工作

[string]([datetime]::Parse($_.split("/")[1]))

这不适合排序,因为它不按年份或时间排序。 在 ticks 中表示 [datetime] 解决了这个问题。

[string]([datetime]::Parse($_.split("/")[1]).ticks)

我已经编辑了上面的代码以反映这一点。

您可以将代码块传递给 sort 以进行自定义排序 属性,而无需重建数组。 (捏住 Jan Chrbolka 的日期时间解析):

$getDate = { [datetime]::Parse($_.split("/")[1].replace(' -','')) }
$data | sort $getDate

或排序-Descending来反转它。

但是如果不拆分行就无法使用日期和数字,搜索 "much simpler way" 似乎有点无果。