排序对象未按预期排序
Sort-Object not sorting as expected
我有一个非常大的 CSV(竖线分隔),有四列(ID、名称、值、日期 (yyyy-MM-dd))
我正在尝试删除日期不等于最近日期的所有行。为此,我需要知道文件中的最新日期。
为了测试排序,我决定使用值列 (int)。下面的脚本根本没有在任何列上对文件进行排序,我不明白为什么(尝试过将列强制转换为 int。
Set-Location '<File_Path>'
$file = 'file1.txt'
Import-Csv $file -Delimiter '|' |
Sort-Object @{e= { "Value" -as [int] }} -Descending |
Select-Object -First 10
排序工作完成后,我可以 select 第一个值并使用它来删除不匹配的行。以下是样本集:
"ID"|"NAME"|"Value"|"Date"
"ID000001"|"ID000001"|560000|2008-06-30
"ID000002"|"ID000002"|1490|2013-12-31
"ID000003"|"ID000003"|112038|2013-09-30
"ID000004"|"ID000004"|201103|2013-12-31
"ID000005"|"ID000005"|78205|2014-01-31
"ID000006"|"ID000006"|78205|2014-02-28
"ID000007"|"ID000007"|78205|2014-03-31
"ID000008"|"ID000008"|183979|2014-04-30
"ID000009"|"ID000009"|311380|2014-08-29
"ID000010"|"ID000010"|311380|2014-09-30
"ID000011"|"ID000011"|232693|2014-10-31
"ID000012"|"ID000012"|232693|2014-11-28
"ID000013"|"ID000013"|343243|2014-12-31
"ID000014"|"ID000014"|253822|2015-01-30
"ID000015"|"ID000015"|377489|2015-02-27
"ID000016"|"ID000016"|214111|2015-03-31
"ID000017"|"ID000017"|5690|2009-06-30
"ID000018"|"ID000018"|5690|2009-12-31
"ID000019"|"ID000019"|5690|2010-06-30
"ID000020"|"ID000020"|5000|2010-10-31
"ID000021"|"ID000021"|5000|2010-11-30
"ID000022"|"ID000022"|5000|2010-12-31
"ID000023"|"ID000023"|5000|2011-01-31
"ID000024"|"ID000024"|5000|2011-02-28
"ID000025"|"ID000025"|5000|2011-05-31
表达式"Value" -as [int]
总是returns$null
。
我相信你想要
@{e = { $_.Value -as [int] }}
改为
如果您使用的是 PowerShell 2.0,则 -as
运算符不存在,您必须改用显式转换:
@{e = { [int]$_.Value }}
问题出在 Sort-object 中的 e=。我需要附加 $_。到列的名称:
Set-Location '<File_Path>'
$file = 'file1.txt'
Import-Csv $file -Delimiter '|' | Sort-Object @{e= { $_."Value" -as [int] }} -Descending | Select-Object -First 10
按日期对导入的 CSV 进行分组,按名称(即日期)对组进行排序,然后 select 并展开最后一组:
Import-Csv $file -Delimiter '|' |
Group-Object Date |
Sort-Object Name |
Select-Object -Last 1 -Expand Group
如果您文件中的每条记录都有不同的日期,您可以跳过分组并简单地按日期和 select 最后一条记录排序:
Import-Csv $file -Delimiter '|' |
Sort-Object Date |
Select-Object -Last 1
我有一个非常大的 CSV(竖线分隔),有四列(ID、名称、值、日期 (yyyy-MM-dd))
我正在尝试删除日期不等于最近日期的所有行。为此,我需要知道文件中的最新日期。
为了测试排序,我决定使用值列 (int)。下面的脚本根本没有在任何列上对文件进行排序,我不明白为什么(尝试过将列强制转换为 int。
Set-Location '<File_Path>'
$file = 'file1.txt'
Import-Csv $file -Delimiter '|' |
Sort-Object @{e= { "Value" -as [int] }} -Descending |
Select-Object -First 10
排序工作完成后,我可以 select 第一个值并使用它来删除不匹配的行。以下是样本集:
"ID"|"NAME"|"Value"|"Date"
"ID000001"|"ID000001"|560000|2008-06-30
"ID000002"|"ID000002"|1490|2013-12-31
"ID000003"|"ID000003"|112038|2013-09-30
"ID000004"|"ID000004"|201103|2013-12-31
"ID000005"|"ID000005"|78205|2014-01-31
"ID000006"|"ID000006"|78205|2014-02-28
"ID000007"|"ID000007"|78205|2014-03-31
"ID000008"|"ID000008"|183979|2014-04-30
"ID000009"|"ID000009"|311380|2014-08-29
"ID000010"|"ID000010"|311380|2014-09-30
"ID000011"|"ID000011"|232693|2014-10-31
"ID000012"|"ID000012"|232693|2014-11-28
"ID000013"|"ID000013"|343243|2014-12-31
"ID000014"|"ID000014"|253822|2015-01-30
"ID000015"|"ID000015"|377489|2015-02-27
"ID000016"|"ID000016"|214111|2015-03-31
"ID000017"|"ID000017"|5690|2009-06-30
"ID000018"|"ID000018"|5690|2009-12-31
"ID000019"|"ID000019"|5690|2010-06-30
"ID000020"|"ID000020"|5000|2010-10-31
"ID000021"|"ID000021"|5000|2010-11-30
"ID000022"|"ID000022"|5000|2010-12-31
"ID000023"|"ID000023"|5000|2011-01-31
"ID000024"|"ID000024"|5000|2011-02-28
"ID000025"|"ID000025"|5000|2011-05-31
表达式"Value" -as [int]
总是returns$null
。
我相信你想要
@{e = { $_.Value -as [int] }}
改为
如果您使用的是 PowerShell 2.0,则 -as
运算符不存在,您必须改用显式转换:
@{e = { [int]$_.Value }}
问题出在 Sort-object 中的 e=。我需要附加 $_。到列的名称:
Set-Location '<File_Path>'
$file = 'file1.txt'
Import-Csv $file -Delimiter '|' | Sort-Object @{e= { $_."Value" -as [int] }} -Descending | Select-Object -First 10
按日期对导入的 CSV 进行分组,按名称(即日期)对组进行排序,然后 select 并展开最后一组:
Import-Csv $file -Delimiter '|' |
Group-Object Date |
Sort-Object Name |
Select-Object -Last 1 -Expand Group
如果您文件中的每条记录都有不同的日期,您可以跳过分组并简单地按日期和 select 最后一条记录排序:
Import-Csv $file -Delimiter '|' |
Sort-Object Date |
Select-Object -Last 1