在 powershell 中对未命名的整数列进行排序
Sorting an unnamed integer column in powershell
我很乐意在 powershell 中对如下所示的 csv 进行排序:
0.980242;DATABASE_PICTURES/P1040793.JPG
0.167471;DATABASE_PICTURES/P1040805.JPG
0.133792;DATABASE_PICTURES/P1040808.JPG
0.616142;DATABASE_PICTURES/P1040819.JPG
0.0485409;DATABASE_PICTURES/P1040825.JPG
0.17998;DATABASE_PICTURES/P1040826.JPG
0.0428832;DATABASE_PICTURES/P1040837.JPG
0.713708;DATABASE_PICTURES/P7020228.JPG
1;DATABASE_PICTURES//P7020229.JPG
我想在第一列中从最高到最低对列表进行排序 -->
1;DATABASE_PICTURES//P7020229.JPG
0.980242;DATABASE_PICTURES/P1040793.JPG
0.713708;DATABASE_PICTURES/P7020228.JPG
0.616142;DATABASE_PICTURES/P1040819.JPG
and so on
我试过这个脚本
Import-CSV C:\xampp\htdocs\results\result.csv -Header ('foo', 'bar') -delimiter ';' | Sort-Object foo
但它什么也没做。我还研究了一半的 internetz,但是 none 给定的代码对我有用或有意义。有人可以给我提示吗?
只是为了在这里得到答案,因为到目前为止还没有人知道。
您遇到的问题不是排序不起作用,而是它按字母顺序排序,而不是像您期望的那样按数字排序。
Foo
---
0.0428832
0.0485409
0.133792
0.167471
0.17998
0.616142
0.713708
0.980242
1
当使用 Import-CSV
导入所有属性时,它们被键入为字符串。来自 Get-Member
的输出
Bar NoteProperty System.String Bar=DATABASE_PICTURES/P1040793.JPG
Foo NoteProperty System.String Foo=0.980242
根据您代码的其他需求,您可以简单地使用@PetSerAI 的建议并将其转换为排序。
`| Sort-Object {[double]$_.Foo} -Descending`
如果您对该数据还有其他事情要做,那么在导入后更改其类型可能是一个优势,这样您就不必进行多次转换。
$data = Import-CSV C:\xampp\htdocs\results\result.csv -Header ('foo', 'bar') -delimiter ';' |
Select-Object -ExcludeProperty Foo @{Name="Foo";Expression={[double]$_.Foo}},*
$data | Sort-Object foo -Descending
我会假设你有更多的属性,只有 foo
和 bar
所以你不必重新输入所有的属性你可以 -ExcludeProperty
需要特别注意的一个,然后使用 Calculated 属性 将变量转换为 [double]
。现在您可以 Sort
并获得预期的结果。
Bar NoteProperty System.String Bar=DATABASE_PICTURES/P1040793.JPG
Foo NoteProperty <b>System.Double</b> Foo=0.980242
我很乐意在 powershell 中对如下所示的 csv 进行排序:
0.980242;DATABASE_PICTURES/P1040793.JPG
0.167471;DATABASE_PICTURES/P1040805.JPG
0.133792;DATABASE_PICTURES/P1040808.JPG
0.616142;DATABASE_PICTURES/P1040819.JPG
0.0485409;DATABASE_PICTURES/P1040825.JPG
0.17998;DATABASE_PICTURES/P1040826.JPG
0.0428832;DATABASE_PICTURES/P1040837.JPG
0.713708;DATABASE_PICTURES/P7020228.JPG
1;DATABASE_PICTURES//P7020229.JPG
我想在第一列中从最高到最低对列表进行排序 -->
1;DATABASE_PICTURES//P7020229.JPG
0.980242;DATABASE_PICTURES/P1040793.JPG
0.713708;DATABASE_PICTURES/P7020228.JPG
0.616142;DATABASE_PICTURES/P1040819.JPG
and so on
我试过这个脚本
Import-CSV C:\xampp\htdocs\results\result.csv -Header ('foo', 'bar') -delimiter ';' | Sort-Object foo
但它什么也没做。我还研究了一半的 internetz,但是 none 给定的代码对我有用或有意义。有人可以给我提示吗?
只是为了在这里得到答案,因为到目前为止还没有人知道。
您遇到的问题不是排序不起作用,而是它按字母顺序排序,而不是像您期望的那样按数字排序。
Foo
---
0.0428832
0.0485409
0.133792
0.167471
0.17998
0.616142
0.713708
0.980242
1
当使用 Import-CSV
导入所有属性时,它们被键入为字符串。来自 Get-Member
Bar NoteProperty System.String Bar=DATABASE_PICTURES/P1040793.JPG
Foo NoteProperty System.String Foo=0.980242
根据您代码的其他需求,您可以简单地使用@PetSerAI 的建议并将其转换为排序。
`| Sort-Object {[double]$_.Foo} -Descending`
如果您对该数据还有其他事情要做,那么在导入后更改其类型可能是一个优势,这样您就不必进行多次转换。
$data = Import-CSV C:\xampp\htdocs\results\result.csv -Header ('foo', 'bar') -delimiter ';' |
Select-Object -ExcludeProperty Foo @{Name="Foo";Expression={[double]$_.Foo}},*
$data | Sort-Object foo -Descending
我会假设你有更多的属性,只有 foo
和 bar
所以你不必重新输入所有的属性你可以 -ExcludeProperty
需要特别注意的一个,然后使用 Calculated 属性 将变量转换为 [double]
。现在您可以 Sort
并获得预期的结果。
Bar NoteProperty System.String Bar=DATABASE_PICTURES/P1040793.JPG
Foo NoteProperty <b>System.Double</b> Foo=0.980242