我有一个大数组(100k +行),应该排序。排序标准是行中的时间戳。天真的使用排序功能的方法不起作用。如何按日期/时间对其进行排序?
数组是文件内容。但是这个例子说明了如何弄错:
$a = @()
$a += "Line SystemTime LocalTime Facility Severity ID Message"
$a += "0 1/10/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base E ID:03590006 Init - Could not open file (lastError=0x00000037)"
$a += "2 1/9/2019 14:30:40,442 1/9/2019 15:30:40,442 FTP W ID:035A001A select failed, err:10038. Shutdown FTP"
$a += "5 1/9/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base E ID:03590006 Could not connect to changed event."
$a += "3 1/9/2019 14:30:40,460 1/9/2019 15:30:40,460 Telnet W ID:02FE000E select failed, err:10038. Shutdown Telnet"
$a | sort
时间戳前面的行号将被忽略。显然,sort cmdlet按字母顺序排序。我怎么知道它应该使用日期/时间?
答案 0 :(得分:2)
如果您的数据是CSV,则最好的选择是使用ConvertFrom-CSV
cmdlet将其转换为cmdlet并按所需属性对其进行排序。
在您的示例中,您可以在Sort-Object
cmdlet中使用正则表达式来获取e。 G。第一个日期并将其转换为日期时间:
$a | Select-Object -Skip 1 |
Sort-Object { [datetime]($_ -replace '^\d*\s*([^,]+).*', '$1')}
注意:我不得不跳过标题(第一行)
输出:
5 1/9/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base E ID:03590006 Could not connect to changed event.
2 1/9/2019 14:30:40,442 1/9/2019 15:30:40,442 FTP W ID:035A001A select failed, err:10038. Shutdown FTP
3 1/9/2019 14:30:40,460 1/9/2019 15:30:40,460 Telnet W ID:02FE000E select failed, err:10038. Shutdown Telnet
0 1/10/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base E ID:03590006 Init - Could not open file (lastError=0x00000037)