web-dev-qa-db-ja.com

Sort-ObjectとIntegers

やあみんなCSVファイルの数字で列を並べ替えようとしています。しかし、どういうわけかそれは機能しません。サンプル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

明らかに正しい順序ではありません。誰かがこの問題を解決する方法を教えてもらえますか?ありがとうございました!

16
ScriptingBerry

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 }

38
Frode F.

Sort関数はこれらをテキスト文字列として認識しているようです。これらのテキスト文字列を実際の整数またはその他の数値タイプに解析してから、並べ替える必要があります。

0
WDS