質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

891閲覧

PowerShellの配列と変数の比べた結果をTrueにする方法

yyyy666

総合スコア15

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/05/11 07:18

編集2018/05/11 07:21

$Datas = @()

$Data = New-Object PSObject | Select-Object 日時,ユーザ名

$Data.日時 = "2018/05/11"
$Data.ユーザ名 = "hoge"

$Datas += $Data

$Data = New-Object PSObject | Select-Object 日時,ユーザ名

$Data.日時 = "2018/05/11"
$Data.ユーザ名 = "hogehoge"

$Datas += $Data

$Data = New-Object PSObject | Select-Object 日時,ユーザ名

$Data.日時 = "2018/05/11"
$Data.ユーザ名 = "hoge"

$Datas += $Data

$Datas[0] -eq $Data

実行結果:false

これを応用して配列の重複を排除したいのですが、

実行結果のfalseの部分をTrueにする方法はありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2018/05/11 12:05

何についての重複を排除したいのですか(何をもって同じ物としますか)? 例:同じインスタンスのオブジェクト・日時・ユーザ名・日時とユーザ名両方が一致する物 そこさえはっきりすれば、Sort-Object -Uniqueや辞書で簡単に重複を排除できます
yyyy666

2018/05/14 02:02

お返事が遅くなってしまいました。日時とユーザ名の両方が完全一致するものを重複を排除するのが目的です。
guest

回答1

0

ベストアンサー

質問そのものへの回答

$Datas[0] -eq $Dataの場合、PSObjectのインスタンスが同じかどうか、の判定となっているはずです(中の値は一切考慮していない)。

日時・ユーザー名の完全一致を確認したい場合、
($Datas[0].日時 -eq $Data.日時) -and ($Datas[0].ユーザ名 -eq $Data.ユーザ名)
とする必要があります(PowerShellの-eq演算子は大文字小文字を区別しないため、必要であれば-ieqなどを使用します)。


参考:重複の排除

参考として、PowerShellの組み込みコマンドレットや.NETのクラスを使って重複を排除する方法を示します。

厳密な判定にはなりませんが、他の質問を見る限り、以下の方法でも大体はなんとかなると思います。

簡易判定・順番無視

posh

1Write-Host 簡易判定・順番無視 2# ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除 3$Datas | 4 Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique

Sort-ObjectコマンドレットにUniqueスイッチを指定すると、重複を排除できます。
また、Propertyにスクリプトブロックを渡すことでソートのキーを指定できます。

一致の判定方法:単純に文字列結合して比較
順番:維持されない

簡易判定・順番維持

posh

1$orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary 2foreach ( $o in $Datas ) { 3 $key = $o.ユーザ名 + $o.日時 4 if ( !$orderDic.Contains($key) ) { 5 $orderDic.Add( $key , $o ) 6 } 7} 8Write-Host 簡易判定・順番維持 9$orderDic.Values

一致判定に使う物は先ほどと同じで、OrderedDictionaryを使うことで順番を維持しながら重複を排除します。

一致の判定方法:単純に文字列結合して比較
順番:維持される

上記処理比較用サンプル

posh

1# https://teratail.com/questions/125630 2# 参考・サンプル用 3 4# 配列の+=演算子は遅いのでListで代替 5$Datas = New-Object -TypeName System.Collections.Generic.List[psobject] 6 7# パターンを増やすため生成方法変更 8[string]$csvString = @' 9日時,ユーザ名 102018/05/11,hoge 112018/05/11,hogehoge 122018/05/11,hoge 132018/05/12,hoge 14'@ 15 16$csvString | ConvertFrom-Csv | %{ $Datas.Add($_) } 17 18 19Write-Host 簡易判定・順番無視 20# ユーザー名と日時を文字列連結した結果({$_.ユーザ名 + $_.日時})を使って重複排除 21$Datas | 22 Sort-Object -Property {$_.ユーザ名 + $_.日時} -Unique | Format-Table #無いと出力がごちゃ混ぜになってしまうため 23<# 24日時 ユーザ名 25-- ---- 262018/05/11 hoge 272018/05/12 hoge 282018/05/11 hogehoge 29#> 30 31 32$orderDic = New-Object -TypeName System.Collections.Specialized.OrderedDictionary 33foreach ( $o in $Datas ) { 34 $key = $o.ユーザ名 + $o.日時 35 if ( !$orderDic.Contains($key) ) { 36 $orderDic.Add( $key , $o ) 37 } 38} 39Write-Host 簡易判定・順番維持 40$orderDic.Values 41<# 42日時 ユーザ名 43-- ---- 442018/05/11 hoge 452018/05/11 hogehoge 462018/05/12 hoge 47#>

投稿2018/05/14 11:55

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問