CodePowershell

PowerShellで連想配列(ハッシュ)をオブジェクトに変換する<自作関数>

Code

本ブログのアクセス解析を見たところ、思っていたよりもPowerShell関連の記事へのアクセス数が多いため、しばらくPowerShell関連の記事を書こうかと思ってます。

PowerShellは標準機能で色々な関数を利用することができます。
例えば、CSVファイルを扱うためのImport-CsvExport-Csvなどは非常に便利で、簡単にCSVファイルの読み書きをすることができます。

ただし、Export-Csv関数でCSVファイルとして書き出すには、オブジェクト形式として書き出すデータを用意する必要があります。

そこで、今回は私が自作した連想配列(ハッシュ)をオブジェクトに変換する関数について記載します。

私もよく使うので共通関数ファイルに保存していつでも使えるようにしています。オススメです。

1. 自作した関数

いきなりですが、以下の関数をコピペしてもらえればOKです。

配列内にあるハッシュをadd-memberを使ってオブジェクト化しています。

  • INPUT :配列内に連想配列が入った形(後で説明)
  • RETURN : オブジェクト
function hash2obj($hash){
    $objs = @()
    foreach ($row in $hash) {
        $obj = New-Object PSObject
        foreach ($key in $row.keys){
            $obj | add-member -membertype NoteProperty -name $key -value $row[$key]
        }
        $objs += $obj
    }
    return $objs
}

2. 使い方(例)

2.1. データ形式

まず、変換元のデータの形式についてです。
以下のような配列内にハッシュを入れた形となります。

キーとして「perfecture」と「code」を持ってます。

$arrays = @(
    @{"prefecture" = "tokyo"; "code" = "1000" },
    @{"prefecture" = "kanagawa"; "code" = "2000" },
    @{"prefecture" = "saitama"; "code" = "3000" },
    @{"prefecture" = "nagano"; "code" = "4000" },
    @{"prefecture" = "niigata"; "code" = "5000" }
)

2.2. 失敗する例

このデータをCSVファイルに書き出したい場合に、
このようにそのままExport-CSVをしようとすると・・・

$arrays | Export-Csv -Path "ng.csv" -Encoding Default  -NoTypeInformation

エラーになってしまいます。

  • ng.csv
"IsReadOnly","IsFixedSize","IsSynchronized","Keys","Values","SyncRoot","Count"
"False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","2"
"False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","2"
"False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","2"
"False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","2"
"False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","2"

2.3. 成功する例

そこで、先ほどの関数を利用して、オブジェクトに変換してExport-CSVをします。

hash2obj($arrays) | Select-Object * | Export-Csv -Path "ok.csv" -Encoding Default  -NoTypeInformation`

正しくCSVに出力されます。先頭行にキーも表示されています。

  • ok.csv
"prefecture","code"
"tokyo","1000"
"kanagawa","2000"
"saitama","3000"
"nagano","4000"
"niigata","5000"

3. 最終的なサンプルコード

最終的なサンプルコードです。動作確認済みです。

function hash2obj($hash) {
    $objs = @()
    foreach ($row in $hash) {
        $obj = New-Object PSObject
        foreach ($key in $row.keys) {
            $obj | add-member -membertype NoteProperty -name $key -value $row[$key]
        }
        $objs += $obj
    }
    return $objs
}

$arrays = @(
    @{"prefecture" = "tokyo"; "code" = "1000" },
    @{"prefecture" = "kanagawa"; "code" = "2000" },
    @{"prefecture" = "saitama"; "code" = "3000" },
    @{"prefecture" = "nagano"; "code" = "4000" },
    @{"prefecture" = "niigata"; "code" = "5000" }
)
# そのままExport-CSVはできない
$arrays |  Export-Csv -Path "errot.csv" -Encoding Default  -NoTypeInformation

# オブジェクトに変換すると成功する
hash2obj($arrays) | Select-Object * | Export-Csv -Path "succcess.csv" -Encoding Default  -NoTypeInformation

PowerShellの学習におすすめの書籍

PowerShellクックブック [オライリー]

私も実際に持っていますが、間違いなくこの本はオススメできます。オライリーシリーズなので定評があるというだけでなく,実際に良書だと思います。

オライリー社の書籍というと初心者にはとっつきにくイメージがありますが、この書籍に掲載されている例は基本的なものが多く,入門者が使い方を覚えるためには丁度よいレベルの本だと感じます。

今回は以上となります。

コメント