重複要素を除外して配列を出力する

 重複する要素のある配列から、重複要素を除外して全データを出力したいことがあります。たとえば、1,1,2,3,3,3,4という配列で、1〜4を1回ずつ出力する処理です。このような処理を実現する方法は複数ありますので、それらを紹介します。

異なる少数の種類のデータが何万件もある場合

 出現した要素を配列に格納しておき、過去に出現したデータであれば(配列に含まれていれば)無視し、過去に出現していなければ配列に格納したうえで出力します。

> $source = 11,9,5,6,3,5,6,8,2,12,9,8,11,4,4,1,1,9,8
> $items=@()
> $source | %{ if(-not ($items -contains $_)){ $items+=$_; $_ }}
11
9
5
6
3
8
2
12
4
1

 ここでは、$sorceのところが整数値の配列ですが、配列であれば何でも構いません。

ソートされた配列を出力する

 先ほどの方法とほぼ同じですが、過去に出現した要素のすべてを配列に記憶しなくても、最後のひとつだけ記憶しておけば済みます。

 バラバラの順番に要素が入っている配列でもソートすればこの方法が使えます。ただし、元の配列のデータ数がすべてそろわないとソートはできないため、巨大なファイルを1行ずつ処理するという用途には不向きです。

> $source = 11,9,5,6,3,5,6,8,2,12,9,8,11,4,4,1,1,9,8
> $sortedSource = $source | Sort-Object
> $prev=$null; $sortedSource | %{ if($_ -ne $prev){ $prev=$_; $_ } }
1
2
3
4
5
6
8
9
11
12
inserted by FC2 system