質問: "hoge" $Datas += $Data $Datas[0] -eq $Data 実行結果:false これを応用して配列の重複を排除したいのですが、 実行結果のfalseの部分をTrueにする方法はありますか?
回答: 質問そのものへの回答 =========== `$Datas[0] -eq $Data`の場合、PSObjectのインスタンスが同じかどうか、の判定となっているはずです(中の値は一切考慮していない)。 日時・ユーザー名の完全一致を確認したい場合、 `($Datas[0].日時 -eq $Data.日時) -and ($Datas[0].ユーザ名 -eq $Data.ユーザ名)` とする必要があります(PowerShellの`-eq`演算子は大文字小文字を区別しないため、必要であれば`-ieq`などを使用します)。 参考:重複の排除 ========= 参考として、PowerShellの組み込みコマンドレットや.NETのクラスを使って重複を排除する方法を示します。 厳密な判定にはなりませんが、他の質問を見る限り、以下の方法でも大体はなんとかなると思います。 簡易判定・順番無視 ``` Write-Host 簡易判定・順番無視 # ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除 $Datas | Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique ``` `Sort-Object`コマンドレットに`Unique`スイッチを指定すると、重複を排除できます。 また、`Property`にスクリプトブロックを渡すことでソートのキーを指定できます。 一致の判定方法:単純に文字列結合して比較 順番:維持されない 簡易判定・順番維持 ``` $orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary foreach ( $o in $Datas ) { $key = $o.ユーザ名 + $o.日時 if ( !$orderDic.Contains($key) ) { $orderDic.Add( $key , $o ) } } Write-Host 簡易判定・順番維持 $orderDic.Values ``` 一致判定に使う物は先ほどと同じで、`OrderedDictionary`を使うことで順番を維持しながら重複を排除します。 一致の判定方法:単純に文字列結合して比較 順番:維持される 上記処理比較用サンプル ``` # # 参考・サンプル用 # 配列の+=演算子は遅いのでListで代替 $Datas = New-Object -TypeName System.Collections.Generic.List[psobject] # パターンを増やすため生成方法変更 [string]$csvString = @' 日時,ユーザ名 2018/05/11,hoge 2018/05/11,hogehoge 2018/05/11,hoge 2018/05/12,hoge '@ $csvString | ConvertFrom-Csv | %{ $Datas.Add($_) } Write-Host 簡易判定・順番無視 # ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除 $Datas | Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique | Format-Table #無いと出力がごちゃ混ぜになってしまうため <# 日時 ユーザ名 -- ---- 2018/05/11 hoge 2018/05/12 hoge 2018/05/11 hogehoge #> $orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary foreach ( $o in $Datas ) { $key = $o.ユーザ名 + $o.日時 if ( !$orderDic.Contains($key) ) { $orderDic.Add( $key , $o ) } } Write-Host 簡易判定・順番維持 $orderDic.Values <# 日時 ユーザ名 -- ---- 2018/05/11 hoge 2018/05/11 hogehoge 2018/05/12 hoge #> ```