Power BIのデータフローで複数のJSONファイルを結合する

## はじめに
SharePointサイトに置いたJSON形式のログなどを、SharePointフォルダで取り込んで結合しようとした際に、なぜかCSVのようにうまくいきませんでした。いろいろ試して回避策を見つけましたので紹介します。
## 対象者
Power BIサービスでデータフローを使っている人向けです。
## 結論
JSONの結合はPower BI デスクトップを使ってローカルフォルダを参照した場合には問題なく自動処理できます。Power BI サービスのデータフローには、Power BI デスクトップとPower Queryで使われるM言語に互換性があるので、ローカルで作った式をそのままコピーしてしまおうというのが今回の目論見です。
## 準備
まずは実現したいことの準備をします。適当な同じ書式で作成したJSONファイルを、適当なSharePointサイトのドキュメントフォルダに保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/9af82b5c-04f8-d2f5-3330-e55742b9cf1d.png)
ちなみに、今回はサンプルとして、[「JSON　サンプル」でググった際に最初に出てきたIBMのドキュメントで紹介されていた２つのJSONの書式](https://www.ibm.com/docs/ja/datapower-gateway/7.6?topic=json-examples)をそのままメモ帳にコピーし、 1.json、2.jsonと名前を付けて保存したものを、SharePointサイトにアップロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/d51213d4-e9c3-3d46-9188-30a972955c2e.png)
## まずは失敗例から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/b4667712-d282-9f87-10a5-463e69e3e075.png)
データフローを作成しSharePointフォルダを選択します。先ほど２つのJSONファイルをアップロードしたSharePointサイトのURLを接続設定のサイトURLにコピーし、認証の種類は組織アカウントで先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/6557a7bc-864f-358a-38a9-31b8262cdd89.png)
ここで自動結合できればよいのですが、JSONファイルを保存したフォルダはもっと下層にあるので、とりあえず「データの変換」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/65a98a73-efe7-0970-0494-549e853d6973.png)
Folder Pathにフィルタをかけ、先ほどJSONファイルを保存したSharePointサイトのフォルダを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/0812fe2e-40c6-936d-9d65-b7443b78950b.png)

２つのJSONファイルが保存されているフォルダにたどり着いたので、JSONファイルが見えている状態になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/9523df32-6ec0-d71a-fa16-e36cdf03ba6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/84574a5b-6599-658c-eafc-e28cda99e93a.png)
あれ？？　このJSONファイルだと結合に成功してしまいました・・・。綺麗なJSONすぎたのかしら。
ここから先は、この手順で失敗してしまった場合には・・・ってことでお願いします。

## ブラウザでうまくいかなかったときは、ローカルでやるべし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/d944d61e-9d40-e5ff-0936-4d2c9c147ad8.png)
さて、ブラウザで失敗したと仮定して、そんなときにはいったんJSONファイルをいくつかダウンロードしてローカルPCの適当なフォルダに保存しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/976e8349-faf5-6495-7930-805d9cf62994.png)
データ取得から「フォルダ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/8c7098a4-d84b-1a5a-ad25-6c0aa1c819cc.png)
JOSNファイルを保存したローカルのフォルダを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/79e43f53-1158-e3fc-1561-e25ea95a52f1.png)
フォルダを指定したので、そこにあるJSONファイルだけがならんで表示されました。「結合」。ボタンをクリックし、「データの結合と変換」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/4c0d0afb-8222-f4aa-f849-0cb0e5bba6e8.png)
２つのJSONファイルの内容が、いい感じに展開されました。「結合」ボタンで自動処理されて感激です。
## ローカルで作成したクエリをクラウドに移植する
スクリーンショットを見ていただくとわかるように、JSONというクエリと、その内部で変換処理に使われたヘルパークエリが表示されています。このクエリはPower BI Desktopアプリで作成されたものですが、実はブラウザ上のPower BI サービスで作成するデータフローにコピー&ペーストできるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/e955cc12-89ed-cfdc-9af5-c7bd8ba88378.png)
クエリをコピーする際に、ヘルパークエリもまとめてコピーしたいので、折りたたんでCtrlをクリックしながら両方を選択して右クリック。「コピー」を選択します。

まず、JSONと名前の付いたクエリにマウスを持っていき、右クリックして「コピー」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/8f79e549-c2fd-3563-c0e6-b3ca0d1b22e7.png)
次に、ブラウザでデータフローのPower Query画面を開き（この画面が開けない場合は、とりあえず空のクエリを選択してそのまま次に進むと良いです）、「貼り付け」をクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/7a73bcb3-56a8-0537-1524-1915e20420a0.png)
おっと残念。クエリの貼り付けはキーボードのCtrl+Vで行う必要があるようです。素直に従います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/fe750fa3-6520-8a6c-f080-63dbcae2101c.png)
貼り付けできました。何かエラーが出ていますが、この段階ではエラーが出ていますが問題ありません。なぜエラーになっているかは、JSONと名前の付いたクエリをクリックした状態で右クリックし、「詳細エディタ」を開いてみるとわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c02c1cd0-db33-7092-3ade-e827fa295d43.png)
一番先頭にあるソースにローカルのCドライブにあるフォルダが選択されているからです。ブラウザで開いているPower BIサービスからは、手元のPCのローカルフォルダは除きにいけませんから、エラーが出るのも当然です。
逆に言うと、JSONフォルダが置いてあるSharePointフォルダをここに持ってくれば解決です。
## SharePointフォルダを指定するクエリを作る
ローカルのフォルダが指定してあるところに、直接SharePointフォルダを見に行く式を書いても良いのですが、ここは綺麗に読み込みだけを行う新しいクエリを作りましょう。
「データを取得」から、詳細の中にあるSharePointフォルダを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/174f6571-3b97-b388-a0e5-4f90e8d1236b.png)
失敗例と同じように、JSONファイルを置いてあるSharePointサイトのURLを指定して先に進みます。Folder PathでJSONファイルが置いてあるフォルダに絞り込みをかけるところも同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/187dedff-f450-f221-8314-8ac2df689afa.png)
できたクエリの名前を適当な名前に変更します。今回は「SPO_JSON_Folder」にしました。この名前をCtrl + Cでコピーして覚えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/204c8f07-40b8-35cb-4511-bc791972b961.png)
いよいよ、エラーが出ていたJSONクエリを、「詳細エディタ」で開きます。先ほどエラーの原因になっていたローカルフォルダが指定されている部分「Folder.Files("C:\tmp\JSON")」をSharePointフォルダの指定に使ったクエリの名前「SPO_JSON_Folder」に差し替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/0f71f0b3-3799-7dc8-ac79-cfd85aa5c937.png)
先ほどまでJSONというクエリに出ていたエラーが消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c90c99e6-f8bc-f0ec-f9a1-513d40976331.png)
サンプルファイルにはまだエラーが出ています。こちらも「詳細エディタ」で開いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/2b7a0125-8857-d2c8-92c6-4e9f424ca277.png)
やはりローカルPCのCドライブが指定されていますね。先ほどと同じように、SharePointフォルダの場所を取得している「SPO_JSON_Folder」に差し替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/9a942c24-0d7c-e0f5-8238-8a8753a791fb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/7d72b286-0b12-233f-991d-d8d7d72f7b65.png)
これですべてのエラーが消えて、Power BI Desktopアプリで作成したクエリがデータフローに移植できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/4329013a-8832-02a5-6734-309493fd2d02.png)
## データセットからデータフローへの移植にも使える
この方法では、とりあえずPower BI デスクトップで作成したけれど、やっぱりデータフローで処理しておきたかった、というような場合に簡単に移植ができます。アプリとブラウザの間でクエリがコピーできるのが素晴らしいですね。ブラウザ上で処理がうまくできなかった場合に、ローカルにいくつかサンプルファイルを置いてテストを行うようなケースにも使える方法なので、ぜひ活用しましょう。