この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。
前回は、集計について学びました。Measure-Objectを使うと、数値データの合計や平均、最大値、最小値などを求めることができます。

今回は結合です。PowerShellには標準で結合を行うコマンドレットがありません。では、どのようにすればいいのでしょうか。
これまでのデータ処理
PowerShellでは、CSVなどのデータをオブジェクトとして扱い、PSCustomObjectなどのオブジェクトに対してさまざまな操作を行えます。以下はSQLとPowerShellの機能を厳密に対応させたものではなく、処理内容を理解しやすくするための概念的な対応です。
| コマンドレット | 機能 | 対応SQL |
|---|---|---|
| Select-Object | 列の選択 | SELECT句 |
| Where-Object | 行の選択 | WHERE句 |
| Sort-Object | 行の並べ替え | ORDER BY |
| Measure-Object | 集計 | 集計関数 |
| Group-Object | グループ化 | GROUP BY |
こうしてみると、JOIN句(テーブルの結合)に相当するコマンドレットがないことに気づきます。
JoinModule
拡張モジュールJoinModuleを使用すると、JOINに相当するコマンドレット「Join-Object」を使用できるようになります。SQLのJOIN句のように、共通のキーを使って2つのオブジェクトの集合を結合するためのモジュールです。詳細は以下を参照してください。
https://www.powershellgallery.com/packages/JoinModule/3.8.5
以下でインストールできます。
PS > Install-Module -Name JoinModule
インストール結果は以下で確認できます。
PS > Get-InstalledModule Version Name ------- ---- ・・・・ 3.8.5 JoinModule
Join-Object
JoinModuleをインストールすると、コマンドレット「Join-Object」を使用できます。基本的な記述方法は以下の通りです。
Join-Object -LeftObject オブジェクト_1 -RightObject オブジェクト_2
-On 結合に使うプロパティ -JoinType 結合方式
それではJoin-Objectの使用例を見てみましょう。以下の2つのCSVファイルを結合してみましょう。
employees.csv(社員マスター)
社員ID,氏名,部署ID E001,田中太郎,D001 E002,佐藤花子,D002 E003,鈴木一郎,D001 E004,高橋美咲,D003 E005,伊藤健太,D002 E006,山田直子,D004 E007,小林翔太,D005
departments.csv(部署マスター)
部署ID,部署名 D001,営業部 D002,総務部 D003,経理部 D004,開発部 D005,人事部 D006,広報部
ここで、以下のスクリプトを実行してみます。
# 1. 2つのCSVファイルを読み込む $Users = Import-Csv employees.csv $Depts = Import-Csv departments.csv # 2. 部署IDをキーにして、左側のデータをベースに結合させる $Result = Join-Object -LeftObject $Users -RightObject $Depts -On 部署ID -JoinType Left # 3. 結合した結果を表示 $Result
結果は以下のようになりました。
社員ID 氏名 部署ID 部署名 ------ ---- ------ ------ E001 田中太郎 D001 営業部 E002 佐藤花子 D002 総務部 E003 鈴木一郎 D001 営業部 E004 高橋美咲 D003 経理部 E005 伊藤健太 D002 総務部 E006 山田直子 D004 開発部 E007 小林翔太 D005 人事部
2つのCSVファイルが結合された結果が得られました。今回は-JoinType Leftを指定しているため、左側の$Usersに存在する社員を基準に結合します。そのため、部署マスターに存在するD006(広報部)は結果には含まれません。
この結果をパイプライン経由で送ればデータ構成の変更、ファイル出力などの処理ができます。
Join-Objectのパラメーター
Join-Objectのパラメーターのうち、上の例で使用したものをご紹介します。
-LeftObject
結合対象のオブジェクト(左側)を指定します。-RightObject
結合対象のオブジェクト(右側)を指定します。-On
結合のキーとなるプロパティを指定します。-JoinType
結合タイプを指定します。JoinType 結合方法 内容 SQLとの対応 Inner 内部結合 両方に存在するキーだけ INNER JOIN Left 左外部結合 左側を基準に結合 LEFT JOIN Right 右外部結合 右側を基準に結合 RIGHT JOIN Full 完全外部結合 両方のデータを残す FULL OUTER JOIN Cross 交差結合 すべての組み合わせ CROSS JOIN Outer※ 対称差結合 片側にしか存在しないデータ SQLの一般的なOUTER JOINとは異なる ※Outerは、左右のデータのうち、結合キーが一致しないデータだけを残す結合です。排他的論理和に相当し、一般的なSQLのOUTER JOINとは異なります。
次回も結合
いかがでしょうか。JoinModuleを使えば、PowerShellでもSQLのJOINに相当する結合処理を行えるようになります。次回も結合です。引き続きJoinModuleを深掘りしていこうと思います。 お楽しみに!!









