Power Automate | Json形式のデータ変換 | CSVファイルの生成

Power Automate | Json形式のデータ変換 | CSVファイルの生成

今回は前回のブログの続きです。技術検証になります。

前回の記事を見ていない方は以下からどうぞ↓

前回までは、OpenAPIからカスタムコネクタを用いてJsonデータを取得しました。

今回のゴールは Open-Meteoから取得したJsonデータを、PowerAutomateで加工します。

Open-Meteoから取得されるjsonデータの形式

jsonデータの形は以下の様になっています。

今回私が欲しいデータは “hourly”の中にある”temperature_2m”と”time”です。

この2つの項目はそれぞれArrayになっており、各インデックスが同一グループになっている感じです。

{
 "generationtime_ms":1.5730857849121094,
 "longitude":139.625,
 "hourly":{
            "temperature_2m":[17,17.7, ...以下略... ],
            "time":["2022-06-08T00:00","2022-06-08T01:00", ...以下略...]
           },
 "latitude":35.625,
 "hourly_units":{
            "temperature_2m":"°C",
            "time":"iso8601"
           },
 "elevation":20.84375,
 "utc_offset_seconds":0
}

PowerAutomateでjsonを扱う

jsonデータを扱うには「JSONの解析」を利用します。

コンテンツには「body:カスタムコネクタから取得される出力結果」を設定します。

スキーマは「サンプルから生成」を行います。

以下の画面に、Open-Meteoから出力されるjsonデータをコピペします。

スキーマが自動生成されます。今回は以下のような感じです。

{
    "type": "object",
    "properties": {
        "generationtime_ms": {
            "type": "number"
        },
        "longitude": {
            "type": "number"
        },
        "hourly": {
            "type": "object",
            "properties": {
                "temperature_2m": {
                    "type": "array"
                },
                "time": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "latitude": {
            "type": "number"
        },
        "hourly_units": {
            "type": "object",
            "properties": {
                "temperature_2m": {
                    "type": "string"
                },
                "time": {
                    "type": "string"
                }
            }
        },
        "elevation": {
            "type": "number"
        },
        "utc_offset_seconds": {
            "type": "integer"
        }
    }
}

Jsonの解析結果を扱う

前述でも述べた通り、今回欲しいデータは「hourly>temperature_2m」と「hourly>time」です。

これを最終的には

time | temp
——————————
time[0] | temperature_2m[0]
time[1] | temperature_2m[1]
time[2] | temperature_2m[2]

と出力したいです。

と言うことで、これら2つの項目をまずは配列変数に格納します。

①配列変数の初期化

まずは変数を初期化します。今回は2つの配列変数を作成します。

また初期値には、timeとtemperature_2mを格納します。以下の様な感じです。

※ちなみに timeもtemperature_2mはそれぞれ2つずつ存在します。

1つは「hourly_units」の中にある項目、もう1つはそれぞれのリストデータ(全データがくっついている状態のもの)です。今回は後者(リストデータを選びます)

③2つの変数を初期化する

データ加工用に2つの変数を新たに定義します。

・配列変数:Json配列(CSV作成のため、time:temperature の組み合わせをJson形式で作成)

・カウンタ:後述のApply to eachにて、Json配列のインデックスを指定する際に使用

以下の様に設定しました。

④Json配列の作成

ここでは、timeとtemperature(temp)を1セットにしたJsonファイルを作成します。

「Apply to each」は「配列の長さ分」繰り返しが行われます。

今回は Arr_time(Arr_tempも同様の長さなので、どっちでも良い)の長さ分、繰り返しを行います。

Json配列変数

Json配列変数は、Arr_timeおよびArr_tempの値を動的に設定します。

以下の様に記述することで、Apply to eachが繰り返されるたびにCountの値が+1され、各配列のインデックスが増えていきます。

{
 "time": variables('Arr_time')[variables('Count')]
 "temp": variables('Arr_temp')[variables('Count')]
}

⑤CSVテーブルの生成

先ほど作成したJson配列を元に、csvテーブルを作成します。

最終的にCSVファイルを作成する際に、このアクションの出力結果である「csvテーブル」が必要になります。

今回は以下の様に設定しました。

⑥csvファイル生成

最後に、CSVテーブルアクションで生成した「出力」結果をもとに、CSVファイルを作成します。

・フォルダーのパス:OneDrive Businessの適切な置き場を指定

・ファイル名:適当な名前

・ファイルコンテンツ:「出力」←csvテーブルのこと

以上のステップでCSVファイルが生成されます。

実際に動かしてみる

実際にフローを実行しましょう。指定したフォルダーのパス内にファイルが生成されていればOKです。

私の場合は、以下の様な中身になっています。

ボトルネックを見てみる

実際に処理に時間が掛かる工程を確認します。

Apply to eachが思った以上に処理に時間が掛かっているようです。(ここはJson配列を作成する処理ですね。)

今後どういった改善ができるかは、要検討したいと思います。

ではまた!

本日のAmazonおすすめ_Top10

2024-03-29 07:15:43時点