2013-02-23 60 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