2010年6月20日日曜日

◆グループ化して最終データを生かす

以下のようなCSVデータを日付でグループ化して、値はグループごとの最後のデータを生かしたいということがあった。
日付,値
2010/06/16,11
2010/06/16,26
2010/06/16,10
2010/06/17,64
2010/06/17,25
2010/06/18,13
2010/06/18,35
2010/06/18,21
まずは、Import-csvで読み込んでみる。
PS>Import-Csv d:\test.csv
���t                                                        �l
----                                                        --
2010/06/16                                                  11
2010/06/16                                                  26
2010/06/16                                                  10
2010/06/17                                                  64
2010/06/17                                                  25
2010/06/18                                                  13
2010/06/18                                                  35
2010/06/18                                                  21

ん~、日本語が文字化けしている。(いきなりつまずく・・・・)
どうやらUNICODE前提のようだ。
Encoding指定もできないやん。(Powershellの文字コード関係はなんかいまいち)
Import-CsvはExport-Csvしたデータ専用なのかな。
仕方がないのでGet-Contentした後、Convrtする。
PS>gc d:\test.csv | ConvertFrom-Csv
日付                                                        値
----                                                        --
2010/06/16                                                  11
2010/06/16                                                  26
2010/06/16                                                  10
2010/06/17                                                  64
2010/06/17                                                  25
2010/06/18                                                  13
2010/06/18                                                  35
2010/06/18                                                  21

いい感じ。
で、これを日付でグループ化。
20100619232946
Groupプロパティは連想配列のコレクションのようなので、グループごとの先頭なら以下の通り。
PS>gc d:\test.csv | ConvertFrom-Csv | Group 日付 | %{$_.group[0]}
日付                                                        値
----                                                        --
2010/06/16                                                  11
2010/06/17                                                  64
2010/06/18                                                  13

最終は、
gc d:\test.csv | ConvertFrom-Csv | Group 日付 | %{$_.group[-1]}

と思いきや、何も返ってこない。
どうも[-1]で最後が返ってくるのは配列の場合で、コレクションでは実装されていないようだ。
そこで、コレクションを配列に突っ込んでから[-1]で最終データを参照する。
(普通にコレクションのカウントプロパティでも良いとは思うが)

PS>gc d:\test.csv | ConvertFrom-Csv | Group 日付 | %{@($_.group)[-1]}
日付                                                        値
----                                                        --
2010/06/16                                                  10
2010/06/17                                                  25
2010/06/18                                                  21

とりあえずはOKっぽい。
欲が出てきて、グループ集計もやってみたくなった。
ちょっと考えてみたが単純にはいかないかも。
変にこねくり回すより、自前でブレーク集計したほうが簡単かなぁ。
あとでやってみよ。

0 件のコメント:

コメントを投稿