Briswell Tech Blog

ブリスウェルのテックブログです

Power Automate DesktopでCSVファイルをダウンロードしてSQL文を生成してみた

f:id:ri_86:20220322180109p:plain

こんにちは、「ラクして速く」がモットーの辻本です。

このWebサイトに月1でアップされるCSVファイルの情報を、DBに取り込んでください。

そのようなとき、みなさんどうしますか?

CSVファイルのデータ形式がDBと一致しており、新規追加のみであれば、何かツールを使ってDBに取り込むことができるでしょう。

ただ、データが分割されていたり、桁数やフォーマットが違っていたり、DB側で固定値が必要だったり... はたまた、INSERT(追加)ではなく、UPDATE(更新)またはDELETE(削除)の場合は、何かしら加工した上、SQL文を作成して実行する必要があります。

その際、手動でExcelにデータを貼り付けて、加工した上、ごりごりSQL文を作るのはちょっとスマートではないですね。時間もかかります。

そこで登場するのがRPAです。今回はPower Automate Desktopを使ってその作業を完全自動化してみましょう。



【1】フロー完成図

f:id:ri_86:20220317165237p:plain f:id:ri_86:20220317165240p:plain ▲作成するフローの完成図になります。


【2】WebサイトからCSVファイルをダウンロード

f:id:ri_86:20220317182702p:plain ▲今回は「レコーダ」を使用し、WEBサイトからCSVをダウンロードするフローを作成します。

f:id:ri_86:20220323123422p:plain ▲上図のようにWEBサイトのダウンロードボタンを押下する処理をレコーダーで追加します。

f:id:ri_86:20220316170659p:plain ▲ダウンロードしたCSVファイルの中身です。


【3】Excel の起動

f:id:ri_86:20220317142915p:plainExcelカテゴリの中にあるExcel の起動」アクションを追加します。

f:id:ri_86:20220317150759p:plain「ドキュメントパス」は【2】でダウンロードしたCSVを指定してください。


【4】Excel ワークシートから最初の空の列や行を取得

f:id:ri_86:20220317144031p:plainExcelカテゴリの中にあるExcel ワークシートから最初の空の列や行を取得」アクションを追加します。

f:id:ri_86:20220317151059p:plainExcelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

Excel ワークシートから最初の空の列や行を取得」についてですが、
取得したCSVのデータのある最後の行数・列数の+1を取得するアクションです。
今回の場合、下記のように取得できます。
FirstFreeColumn = E すなわち 5
FirstFreeRow = 6

f:id:ri_86:20220317154104p:plain


【5】Loop処理を追加

f:id:ri_86:20220317170630p:plain「ループ」カテゴリの中にある「Loop」アクションを追加します。
「End」アクションは「Loop」アクションを追加すると自動で追加されます。

f:id:ri_86:20220317160536p:plain ▲「終了」についてですがFirstFreeRow = 6 なので
6 - 1 = 5 となり、5回ループすることになります。


【6】Excel ワークシートに書き込み

f:id:ri_86:20220317170624p:plainExcelカテゴリの中にあるExcel ワークシートに書き込み」アクションを追加します。

ループの中にこのアクションを設定することにより、Excel ワークシートに書き込み」アクションをループさせることができます。

f:id:ri_86:20220317160527p:plain

Excelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

「書き込む値」についてですが、作成するSQLクエリやDBの構成によって変更してください。 今回はエクセルの参照機能を使用し、INSERT文を作成しています。
また文字列の中に「%LoopIndex%」を使用することでループのたびに1,2,3,4,5と値を設定することができます。

「書き込みモード」は「指定したセル上」

「列」「行」は書き込みたいセルを設定する箇所になります。
今回は F 列の1行目、F 列の2行目...と書き込みたいので
「列」= 「F」
「行」= 「%LoopIndex%」
と指定しています。

書き込みイメージ

Loop1回目

="INSERT INTO user (id, login_id, user_name, user_type)VALUES('"&A1&"','"B1&"','"&C1&"','"D1"');"
Loop2回目
="INSERT INTO user (id, login_id, user_name, user_type)VALUES('"&A2&"','"B2&"','"&C2&"','"D2"');"
...

Excel書き込み後の文字列イメージ

Loop1回目

INSERT INTO user (id, login_id, user_name, user_type)VALUES('1','satou','佐藤','2');
Loop2回目
INSERT INTO user (id, login_id, user_name, user_type)VALUES('2','suzuki','鈴木','2');
...


【7】Excel ワークシートから読み取り

f:id:ri_86:20220317170641p:plainExcelカテゴリの中にあるExcel ワークシートから読み取り」アクションを追加します。

f:id:ri_86:20220317175914p:plain Excelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

「取得」は「単一セルの値」

「先頭列」「先頭行」は読み取りたいセルを設定する箇所になります。
【6】と同じように F 列の1行目、F 列の2行目...と書き込みたいので
「先頭列」= 「F」
「先頭行」= 「%LoopIndex%」
と指定しています。

読み取りイメージ

Loop1回目

INSERT INTO user (id, login_id, user_name, user_type)VALUES('1','satou','佐藤','2');
Loop2回目
INSERT INTO user (id, login_id, user_name, user_type)VALUES('2','suzuki','鈴木','2');
...

【8】テキストをファイルに書き込みます

f:id:ri_86:20220317170647p:plain「ファイル」カテゴリの中にある「テキストをファイルに書き込みます」アクションを追加します。
f:id:ri_86:20220317160546p:plain「ファイルパス」は作成したい場所に追加してください。
※ファイルパス先にファイルが無い場合は新規でファイルが作成されます。

「書き込むテキスト」は【7】で作成された変数「%ExcelData%」を指定します。

「ファイルが存在する場合」は「内容を追加する」にします。


【9】Excel を閉じる

f:id:ri_86:20220317170636p:plainExcelカテゴリの中にあるExcel を閉じる」アクションを追加します。

f:id:ri_86:20220317160011p:plain ▲ドキュメントパスは【3】で作成された変数「ExcelInstance」を指定します。


【10】作成されたSQLファイルを確認

f:id:ri_86:20220317155803p:plain ▲完成したSQLファイルです。
問題なくクエリが作成されていますね。


【11】最後に

最後まで読んでいただきありがとうございました。
重要なことに時間をかけて、その他のことはできるだけ自動化していきましょう。

その作業、自動化しませんか?