2013-02-23 57 views
10

嘿家伙我想排序与CSV文件中的数字colomn。但不知何故,它不起作用。样本CSV:排序对象和整数

Orange;65 
Red;160 
Green;140 
White;110 
Purple;85 

这是一段代码,我试了一下:

$csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv 
$csv | Sort-Object Number 

这给了我下面的输出:

Color    Number 
-----    ------ 
White    110 
Green    140 
Red     160 
Orange    65 
Purple    85 

显然不是正确的顺序。有人能解释我如何解决这个问题吗?谢谢!

回答

29

Import-CSV默认情况下,将csv列导入为strings。您需要将其投射到int,然后才能按价值排序,而不是“按字母顺序排序”。例如:

$csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv 
$csv | % { $_.Number = [int]$_.Number } 
$csv | Sort-Object Number 

Color Number 
----- ------ 
Orange  65 
Purple  85 
White  110 
Green  140 
Red  160 

作为替代方案,你可以将它转换排序时,这样的:

$csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv 
$csv | Sort-Object @{e={$_.Number -as [int]}} 

甚至更​​短$csv | Sort-Object { [int]$_.Number }

+0

干杯队友得到了整理:) – ScriptingBerry 2013-02-23 12:38:06

+0

你可以解释我,但从你的选择,什么@ {e =是什么意思?尤其是'e'。抱歉打扰你,我还在学习:) – ScriptingBerry 2013-02-23 12:44:16

+1

表达式。这是你用来在powershell中指定属性的东西。在'select-object'中创建自定义字段的示例:'select-object @ {name =“displayedname”; expression = {使用ex $ _。property产生值的代码}}'。 'Sort-Object'不需要列名进行排序,所以我只是使用表达式。 – 2013-02-23 12:55:39

0

看起来sort函数将这些视为文本字符串。您需要将这些文本字符串解析为实际整数或其他数字类型,然后进行排序。

+0

可能是一个想法,在未来提供的如何,而不是只是为什么。 – user66001 2016-01-27 00:21:01