2012年1月20日金曜日

◆CSVの項目を数値としてソートする

こんなCSVファイルが有ったとして、

PS>Import-Csv test.txt

id     name    
--     ----    
3      sato    
5      suzuki  
13     yosida  
1      hara    
11     kubo    

これをidでソートすると、

PS>import-csv test.txt | sort id

id    name
--    ----
1     hara
11    kubo
13    yosida
3     sato
5     suzuki

文字列として解釈されているので、ちょっと残念な結果になってしまう。

こういう時は、PowerShell: ◆ソートのカスタマイズで使ったのと同じ方法で集計プロパティを使うと良い。

PS>Import-Csv test.txt | sort @{e={$_.id -as [int]}}

id    name   
--    ----   
1     hara   
3     sato   
5     suzuki 
11    kubo   
13    yosida 

3 件のコメント:

  1. ともちゃん2012年1月24日 12:05

    はじめまして、まだ1か月のPowerShell初心者です。
    sort @{e={$_.id -as [int]}}
    とされてますが、
    sort {[int]$_.id }
    と記述しても同じ結果が得られると思うのですが、
    それとは違った意図でもあるのでしょうか。

    私が的外れなこと言っていたらごめんなさん。

    返信削除
  2. こんにちは、コメントありがとうございます。

    基本的にはご指摘の方法でキャストしても同じ結果になると思います。
    PowerShellに限らず、C#やVBでも多分そうだと思うのですが、キャストした場合はキャストできないデータ(ここの場合はintに変換できない文字列など)が出現した場合エラーとなってしまいます。
    一方「as演算子」を使った場合は変換できないデータが出現した場合は無視(Nullが返る)してくれます。
    今回の場合は単にソートしたいだけですので、エラーにするよりはそのまま処理を続行させたほうがベターかと判断した次第です。
    ケースによってはキャストの方が良い場合もあると思います。

    返信削除
  3. ともちゃん2012年1月24日 18:12

    >変換できないデータが出現した場合は無視(Nullが返る)してくれます
    ありがとうございます。これは良い情報です。
    実は、分析(統計およびマイニング)のツールを作っているところで、
    Nullを返してくれるということは、大変助かります。
    勉強になりました。良い情報をありがとうございました。

    返信削除