2013-02-23 12 views
10

Hej, próbuję sortować kolumnę liczbową w pliku CSV. Ale jakoś to nie działa. CSV próbki:Sort-Object i Integers

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

To jest kawałek kodu próbowałem go z:

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

co daje mi następujący wynik:

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

Oczywiście nie we właściwej kolejności. Czy ktoś może mi wyjaśnić, jak rozwiązać ten problem? Dziękuję Ci!

Odpowiedz

29

Import-CSV domyślnie importuje kolumny CSV jako strings. Musisz przesłać go do int, aby móc sortować według wartości, a nie "alfabetycznie". Ex:

$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 

Jako alternatywę, można oddać go podczas sortowania, tak:

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

lub nawet krócej $csv | Sort-Object { [int]$_.Number }

+0

Pozdrawiam, kolego, mam to załatwione :) – ScriptingBerry

+0

Czy możesz wyjaśnić mi jednak, z twojej alternatywy, co to znaczy @ {e? Zwłaszcza "e". Przepraszam, że przeszkadzam, wciąż się uczę :) wyrażenie: – ScriptingBerry

+1

. to coś, czego używasz do określania właściwości w powłoce. Przykład tworzenia niestandardowego pola w 'select-object':' select-object @ {name = "displayname"; expression = {kod do tworzenia wartości za pomocą ex $ _. Property etc.}} '. 'Sort-Object' nie potrzebuje nazwy kolumnowej do sortowania, więc użyłem tylko wyrażenia. –

0

Wygląda na to, że funkcja sortowania traktuje je jako ciągi tekstowe. Musisz przeanalizować te ciągi tekstowe do rzeczywistych liczb całkowitych lub innego typu liczbowego, a następnie posortować.

+0

Może być pomysł w przyszłości zapewnić how, a nie tylko dlaczego. – user66001

Powiązane problemy