この記事でわかること!
- Power Automate for desktopで、複数キーワードでファイルやフォルダをAND検索する方法がわかる。
ファイルを複数キーワードでAND検索したい。(論理積)
「フォルダー内のファイルを取得」アクションではAND検索でファイル抽出ができない。
Power Automate for desktopでファイルを検索・抽出する時に使う「フォルダー内のファイルを取得」アクションは、ワイルドカードを使ってファイルをあいまい検索することができます。
しかし、ワイルドカード以外の正規表現に対応していないようなので複雑なパターンでファイルを抽出するには工夫が必要なようです。
「フォルダー内のファイルを取得」アクションとは?
「フォルダー内のファイルを取得」アクションは特定のフォルダの中のファイルパスを取得するアクションです。
「テキストの解析」アクションを使ってAND検索を実現する。
先ほど紹介したように「フォルダー内のファイルを取得」アクションではAND検索ができません。
そこで「テキストの解析」アクションと組み合わせて複数キーワードのすべてをファイル名に含むファイルを検索する方法について紹介します。(AND検索)
「フォルダー内のファイルを取得」アクションでざっくりとファイルパスを抽出した後に、「テキストの解析」アクションで詳細な絞り込みを行い目的のファイルを取得します。
「テキストの解析」アクションとは、文字列あるいはリストの中から特定の文字列を抽出したり、文字列の位置を特定するアクションです。
正規表現とは?
正規表現は、多くのプログラム言語の中で広く採用されている文字列のパターンの表現方法です。正規表現を用いることで文章の中から目的のキーワードを柔軟に抽出することができます。
今回は、正規表現を使ってファイルパスのリストの中から目的のファイルパスのみを抽出します。
正規表現を0から学ぶにはUdemy動画講座がオススメです。Udemyの正規表現をテーマにした動画講座は3つ受講しましたが、その中でも下記の講座が一番わかりやすかったです。
正規表現入門 作業効率アップに役立つ38個の方法購入される場合は、Udemyは頻繁にセールを開催しますので講座をお気に入りに登録しておき、セール時に購入することをオススメします。
セール開催中かを確認する!
フローの作成方法
今回のゴールの確認
今回のゴールを確認します。
下記のような11個のファイルが格納されたテストフォルダを用意しました。
この中から特定の条件にマッチするファイルだけを開き、ファイルの中身を読み取ります。
C:\Users\user\Desktop\test\これは山田と鈴木のファイル.xlsx C:\Users\user\Desktop\test\これは山田と鈴木のファイルです.txt C:\Users\user\Desktop\test\山田と鈴木と佐藤のファイル.txt C:\Users\user\Desktop\test\山田と鈴木のファイル.txt C:\Users\user\Desktop\test\山田のファイル.txt C:\Users\user\Desktop\test\山田山田鈴木鈴木のファイル.txt C:\Users\user\Desktop\test\山田鈴木.txt C:\Users\user\Desktop\test\田中鈴木佐藤.txt C:\Users\user\Desktop\test\田中鈴木加藤山田佐藤.txt C:\Users\user\Desktop\test\鈴木と山田のファイル1969.txt C:\Users\user\Desktop\test\鈴木のファイル.txt
下記がフィルタ条件です。
今回設定したフィルタ条件
- 下記の条件すべてにマッチすること!(AND検索)
- ファイル名に「山田」というキーワードを含む
- ファイル名に「鈴木」というキーワードを含む
- テキストファイルである。(拡張子が.txt)
下記がファイルの中身です。ファイルの中身にはそのファイルのファイル名が記述されています。
フローの作成
PADを起動してフローを作ります。
▲「フォルダー内のファイルを取得」アクションを追加してパラメータを入力します。
パラメータ
- フォルダー:C:\Users\user\Desktop\test
- ファイルフィルター:*
その他の設定はデフォルト値のままにしました。ファイルフィルターに「*(アスタリスク)」を入力することで一旦testフォルダ内のすべてのファイルを取得します。
一旦フローを実行して動作を確認します。フローデザイナー上部の実行ボタンをクリックしてフローを実行しましょう。
▲フローを実行したら結果を確認してみます。「フォルダー内のファイルを取得」アクションの実行結果は「Files変数」に格納されます(名前を変更していなければ)。フローデザイナー画面の右側のフロー変数の中のFiles変数をダブルクリックして、Files変数の中身を確認してみます。
▲Files変数の中身です。testフォルダの中身のファイル10個のファイルパス一覧が取得できました。問題なさそうなので次に進みます。
▲「テキストの解析」アクションを追加してパラメータを入力します。
パラメータ
- 解析するテキスト:%Files%
- 検索するテキスト:別に記載
- 正規表現である:オン
- 最初の出現箇所のみ:オフ
正規表現を使うので「正規表現である」はオンにします。
「最初の出現箇所のみ」は、オンにすると最初にマッチしたひとつのファイルパスのみが取得されます。今回は条件に合致しそうなファイルが複数あるためオフにします。
「検索するテキスト」に入力した正規表現
「検索するテキスト」のパラメータには下記の正規表現を入力しました。
.*(?=.*鈴木)(?=.*山田).*\.txt
正規表現の解説は長くなるので省略します。上の例では正規表現でAND検索を表現する方法として肯定先読みという方法を使っています。気になる方は「正規表現 肯定先読み」でググってみてください。ただ、正規表現の知識がない方がいきなり肯定先読みの記事を読んでも訳がわからないかと思いますので、先に正規表現の基本知識をざっくりとでも頭に入れて、実際に手を動かして正規表現を書いてマッチングさせてみた方が良いかなとは思います。正規表現の表記を練習する際はhttps://regex101.com/などのテストサイトが便利です。
(¥マークは環境によってバックスラッシュとして表示されますがどちらでも同じ役割をしますので気にせず大丈夫です。)
▲フローを実行したら結果を確認してみます。「テキストの解析」アクションの実行結果は「Matches変数」に格納されます(名前を変更していなければ)。フローデザイナー画面の右側のフロー変数の中のMatches変数をダブルクリックして、Matches変数の中身を確認してみます。
C:\Users\user\Desktop\test\これは山田と鈴木のファイルです.txt C:\Users\user\Desktop\test\山田と鈴木と佐藤のファイル.txt C:\Users\user\Desktop\test\山田と鈴木のファイル.txt C:\Users\user\Desktop\test\山田山田鈴木鈴木のファイル.txt C:\Users\user\Desktop\test\山田鈴木.txt C:\Users\user\Desktop\test\田中鈴木加藤山田佐藤.txt C:\Users\user\Desktop\test\鈴木と山田のファイル1969.txt
▲Matches変数の中身です。山田と鈴木をファイル名に含むテキストファイルが抽出されたはずです。
鈴木と山田の登場順序が入れ替わってもマッチしていますし、山田と鈴木がファイル名に含まれるけどエクセルファイルの場合はマッチしていないことがわかります。問題なさそうなので次に進みます。
▲「For each」アクションを追加してパラメータを入力します。
パラメータ
- 反復処理を行う値:%Matches%
パラメータ
- ファイルパス:%CurrentItem%
- 内容の保存方法:単一のテキスト値
- エンコード:UTF-8
%CurrentItem%はFor eachに渡した%Matches%変数の中身のファイルパスが、ループが1回ずつ回るごとに一個ずつ入ってきます。
パラメータ
- 表示するメッセージ:%FileContents%
%FileContents%アクションは「ファイルからテキストを読み取ります」アクションの出力です。
▲フローが完成しました。
フローが完成したのでフローを実行します。
▲フローを実行すると、条件にマッチしたファイルの内容が1件ずつポップアップ表示されました。成功のようです。
Robinソースコード
Folder.GetFiles Folder: $'''C:\\Users\\user\\Desktop\\test''' FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files Text.ParseText.RegexParse Text: Files TextToFind: $'''.*(?=.*鈴木)(?=.*山田).*\\.txt''' StartingPosition: 0 IgnoreCase: False OccurrencePositions=> Positions Matches=> Matches LOOP FOREACH CurrentItem IN Matches File.ReadTextFromFile.ReadText File: CurrentItem Encoding: File.TextFileEncoding.UTF8 Content=> FileContents Display.ShowMessageDialog.ShowMessage Message: FileContents Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed END # [ControlRepository][PowerAutomateDesktop] { "ControlRepositorySymbols": [], "ImageRepositorySymbol": { "Name": "imgrepo", "ImportMetadata": {}, "Repository": "{\r\n \"Folders\": [],\r\n \"Images\": [],\r\n \"Version\": 1\r\n}" } }
▲今回作成したフローのRobinソースコードです。フローデザイナーにコピペすることで今回作成したフローを自分の環境に再現することができます。
ファイルをOR検索するには?
複数キーワードのいずれかを含むOR検索をする方法は下記の記事で紹介しています。
関連記事
まとめ
ファイルを複数キーワードでAND検索する方法を紹介しました。
このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
セール開催中かを確認する!