データベースのテーブルとクエリのようなことをPowerShellの配列でやってみようと思います。
配列の初期化
$array = @("A", "B")
$array.GetType().Name # 型の確認
# Object[]
JSON形式で保存(シリアライズ)
$jsonFile = ".\Query-Array.txt"
$array | ConvertTo-Json | Out-File -FilePath $jsonFile -Encoding utf8 -Force
JSONファイルを読込(デシリアライズ)
$array = Get-Content $jsonFile | ConvertFrom-Json
Get-Content $jsonFile⇒ConvertFrom-Json⇒$array
オブジェクトを要素に配列を初期化
$array = @(
[PSCustomObject]@{
Key = "0999"
Value = "ABC"
No = 1
},
[PSCustomObject]@{
Key = "0888"
Value = "DEF"
No = 2
}
[PSCustomObject]@{
Key = "0777"
Value = "GHI"
No = 3
}
)
$array[0].GetType().Name
# PSCustomObject
並べ替え
Noプロパティを昇順に並べ替え
$array | sort -Property No
#Key Value No
#--- ----- --
#0999 ABC 1
#0888 DEF 2
#0777 GHI 3
複数の項目で並べ替え(降順)
Value,Noプロパティを降順に並べ替え
$array | sort -Property Value, No -Descending
#Key Value No
#--- ----- --
#0777 GHI 3
#0888 DEF 2
#0999 ABC 1
合計を取得
($array | measure -sum -Property No).Sum
#6
最大値を取得
($array | measure -Maximum -Property No).Maximum
#3
最小値を取得
($array | measure -Minimum -Property No).Minimum
#1
平均値を取得
($array | measure -Average -Property No).Average
#2
オブジェクトのプロパティの値を条件に項目を取得
$array | ? { $_.Key -eq "0888"}
#Key Value No
#--- ----- --
#0888 DEF 2
オブジェクトのプロパティの値を条件に件数を取得
($array | ? { $_.Key -eq "0888"}).Count
#1
オブジェクトのプロパティの値を条件に配列のインデックスを取得
$array.IndexOf(($array | ? { $_.Key -eq "0777"}))
#2
配列の末尾に要素を追加
$array += [PSCustomObject]@{
Key = "0666"
Value = "HIJ"
No = 4
}
#$array
#0999 ABC 1
#0888 DEF 2
#0777 GHI 3
#0666 HIJ 4
オブジェクトのプロパティの値を指定して要素を削除
$array = $array | ? { $_.Key -ne "0777"}
$array
#0999 ABC 1
#0888 DEF 2
#0666 HIJ 4
予想外でったのですがPowerShellの配列に要素を追加したり削除したりしようとしたところ、配列は固定だと叱られました。しかたが無いので要素の追加や削除は配列の再作成をしています。
ただこの方法はデータ量が多いと動作が重くなりそうです。
感想
一般的なシェルでパイプラインで引き渡されるデータはテキストですが、PowerShellのパイプラインははオブジェクトを渡します。そのおかげで配列をデータベースのテーブルと見立てて抽出や並べ替えなどクエリのようなことが出来ることが確認できました。
コメント