BizRobo!やAutomation Anywhereなど複数のRPAツールを使っていると、一方で出来ることが他方で出来ないときに大変ストレスを感じることがあります。
しばらくBizRobo!を使っていて、Automation Anywhereを一切使うことが無かった後で、Automation Anywhereを使うことになった際に、「あれっ、文字列の抽出ってAutomation Anywhereでどうやるんだっけ、なんか使いづらいんだけど」という気持ちになったのが、正規表現を使ったパターン検索機能でした。
そこで、Automation Anywhereで文字列を抽出するときに、BizRobo!のコンバーター機能で使っている抽出パターンを使うことが出来ないのか、検証してみました。
【例題】
フォルダ「C:\work」のサブフォルダに日付のフォルダが複数存在していて、ファイルパス「C:\work\20221225\input\abc.xlsx」が分かっていて、このファイルパスからフォルダ名「20221225」を抽出したいとき
■Automation Anywhere A360で一般的と思われる実装例
Automation Anywhereのアクションで実装するなら、日付のフォルダ名が数字8桁になっていることを利用して、正規表現「\d{8}」のパターンを検索し、見つかった位置から8桁抽出する方法が可能です。
<アクション概要>

<アクション詳細>
1行目

2行目

3行目

Automation Anywhereでどう実装するかを考えれば、結果的に上記のような処理フローを思い付くのですが、BizRobo!に慣れてしまった後だと、『BizRobo!ならコンバーター機能を使って1ステップで実装できるんだけどな、パターンの括弧の中が抽出したい値よ。』という発想が、まず出てくるのです。

【パターンの説明】
パターン:.*\\(\d{8})\\.*
括弧の中の文字列が抽出したい文字列です。
括弧の中「\d{8}」は、任意の数字8桁を表しており、
括弧の左側「.*\\」は、抽出したい文字列の左側は「\」で終わる任意の文字列、
括弧の右側「\\.*」は、抽出したい文字列の右側は「\」で始まる任意の文字列、を表しています。
つまり、このパターンは『「\」で終わる任意の文字列と「\」で始まる任意の文字列に囲まれた数字8桁を抽出する』という意味になります。
特徴としては、正規表現によるパターン検索を、処理対象文字列の右側から評価しているところです。
■BizRobo!の抽出パターンを使う実装例
想像していたより大掛かりな仕掛けになってしまって、『こりゃ使えない!』
という代物が完成しました。使うことは無いと思いますが、Automation Anywhere A360からPowerShellスクリプトを実行するサンプルとしてなら、ちょっとは参考になるかもです。
【仕掛け】
文字列の抽出処理自体はPowerShellスクリプトで行う。
PowerShellスクリプトに引数で処理対象文字列ソースと抽出パターンを渡す。
PowerShellスクリプトを実行するバッチコマンドをAutomation Anywhereで作成する。
PowerShellスクリプトの実行結果をクリップボード経由でAutomation Anywhereに取り込む。
【PowerShellスクリプト】

<アクション詳細>
1行目
「%ソース%」の部分を処理対象文字列ソース(今回の例ではファイルパス)に置換する。

ただし、BatchFileTemplateには、下記内容でバッチファイルの原型を作成しておく。

2行目
「%パターン%」の部分を抽出パターンに置換する。

3行目
LFコードをCRLFコードに置換する。

4行目
バッチファイルを保存する。

5行目
バッチファイルを実行する。

6行目
コマンドウィンドウが閉じるのを待つ。(バッチファイルでコマンドウィンドウのタイトルを「PowerShell」にしているので、タイトル「PowerShell」のウィンドウが閉じるのを待つ。)

7行目
クリップボードの内容を取り込む。

8行目
PowerShellスクリプト側では、LFコード区切りで2つの値をクリップボードに出力するので、クリップボードの内容をLFコードで分割してリスト変数「result」に取り込む。

9行目

しばらくBizRobo!を使っていて、Automation Anywhereを一切使うことが無かった後で、Automation Anywhereを使うことになった際に、「あれっ、文字列の抽出ってAutomation Anywhereでどうやるんだっけ、なんか使いづらいんだけど」という気持ちになったのが、正規表現を使ったパターン検索機能でした。
そこで、Automation Anywhereで文字列を抽出するときに、BizRobo!のコンバーター機能で使っている抽出パターンを使うことが出来ないのか、検証してみました。
【例題】
フォルダ「C:\work」のサブフォルダに日付のフォルダが複数存在していて、ファイルパス「C:\work\20221225\input\abc.xlsx」が分かっていて、このファイルパスからフォルダ名「20221225」を抽出したいとき
■Automation Anywhere A360で一般的と思われる実装例
Automation Anywhereのアクションで実装するなら、日付のフォルダ名が数字8桁になっていることを利用して、正規表現「\d{8}」のパターンを検索し、見つかった位置から8桁抽出する方法が可能です。
<アクション概要>

<アクション詳細>
1行目

2行目

3行目

Automation Anywhereでどう実装するかを考えれば、結果的に上記のような処理フローを思い付くのですが、BizRobo!に慣れてしまった後だと、『BizRobo!ならコンバーター機能を使って1ステップで実装できるんだけどな、パターンの括弧の中が抽出したい値よ。』という発想が、まず出てくるのです。

【パターンの説明】
パターン:.*\\(\d{8})\\.*
括弧の中の文字列が抽出したい文字列です。
括弧の中「\d{8}」は、任意の数字8桁を表しており、
括弧の左側「.*\\」は、抽出したい文字列の左側は「\」で終わる任意の文字列、
括弧の右側「\\.*」は、抽出したい文字列の右側は「\」で始まる任意の文字列、を表しています。
つまり、このパターンは『「\」で終わる任意の文字列と「\」で始まる任意の文字列に囲まれた数字8桁を抽出する』という意味になります。
特徴としては、正規表現によるパターン検索を、処理対象文字列の右側から評価しているところです。
■BizRobo!の抽出パターンを使う実装例
想像していたより大掛かりな仕掛けになってしまって、『こりゃ使えない!』


【仕掛け】
文字列の抽出処理自体はPowerShellスクリプトで行う。
PowerShellスクリプトに引数で処理対象文字列ソースと抽出パターンを渡す。
PowerShellスクリプトを実行するバッチコマンドをAutomation Anywhereで作成する。
PowerShellスクリプトの実行結果をクリップボード経由でAutomation Anywhereに取り込む。
【PowerShellスクリプト】
#クリップボードへの出力文字エンコードをANSIにしたいための設定 $OutputEncoding = [Text.Encoding]::Default #===================================================== # extract($in_souce, $in_ptn) # $in_souce:処理対象文字列ソース # $in_ptn :抽出パターン #===================================================== function extract($in_souce, $in_ptn){ #抽出パターンの括弧の左側・括弧の右側・括弧の中の順に分割する。 #抽出パターンの括弧の左側を抽出する。(文字列先頭から「(」の手前まで) $r = $in_ptn -match "^(?<left>.*?)\(.*" if( $r -eq $false ){ Set-Clipboard @($false,"") return } $left = $Matches.left #抽出パターンの括弧の右側を抽出する。(文字列末尾から「)」の手前まで) $r = $in_ptn -match "\)(?<right>.*?)$" if( $r -eq $false ){ Set-Clipboard @($false,"") return } $right = $Matches.right #抽出パターンの括弧の中を抽出する。(「(」と「)」で囲まれた部分) $r = $in_ptn -match "\((?<middle>.*?)\)" if( $r -eq $false ){ Set-Clipboard @($false,"") return } $middle = $Matches.middle #PowerShell「-match」で抽出するための正規表現パターンを生成する。 #(抽出パターンの括弧の中に該当する値を$Matches.valueに抽出するよう編集) $ptn = $left + "(?<value>" +$middle+ "?)" +$right + "$" #抽出を実行する。 $r = $in_souce -match $ptn if($r -eq $false){ #抽出パターンが存在しなかったとき Set-Clipboard @($false,"") return }else{ #抽出パターンが存在したとき Set-Clipboard @($true, $Matches.value) return } } #引数を取り込む。 $in_souce = $args[0] $in_ptn = $args[1] #抽出を実行する。 extract $in_souce $in_ptn<アクション概要>

<アクション詳細>
1行目
「%ソース%」の部分を処理対象文字列ソース(今回の例ではファイルパス)に置換する。

ただし、BatchFileTemplateには、下記内容でバッチファイルの原型を作成しておく。

2行目
「%パターン%」の部分を抽出パターンに置換する。

3行目
LFコードをCRLFコードに置換する。

4行目
バッチファイルを保存する。

5行目
バッチファイルを実行する。

6行目
コマンドウィンドウが閉じるのを待つ。(バッチファイルでコマンドウィンドウのタイトルを「PowerShell」にしているので、タイトル「PowerShell」のウィンドウが閉じるのを待つ。)

7行目
クリップボードの内容を取り込む。

8行目
PowerShellスクリプト側では、LFコード区切りで2つの値をクリップボードに出力するので、クリップボードの内容をLFコードで分割してリスト変数「result」に取り込む。

9行目

コメント
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。