複雑なテキストをパディングする

ウェブサイトなどから取得した日付データに表記のゆれがあることがある。日付や時間や分や秒の数値は、一桁で「2022年1月1日」と表現する場合と二桁で「2022年01月01日」と表現する場合がありどちらも一般的であるためにウェブサイトによって表記が異なることも多い。特に一桁の表現である場合にはソートができないので困ることがある。例えば一桁の日付の表現のデータをソートすると1月10日よりも後ろに1月2日が並んでしまう。これを直したいときにはアクション「テキストのパディング」を使うことがあるだろう。

f:id:yujihb:20211220011841j:plain

一方でウェブサイトから取得するテキストが複雑でテキストの中央部にパディングしたい対象の部分があったりすると、パディングするために非常に多くの「テキストの解析」や「サブテキストの取得」アクションが必要となり、フローが煩雑になってとても目にわるい。そんなときはPythonスクリプトなどを利用してアクション一行でまとめてしまいたい。

例えばウェブサイトから取得したテキストが「2022年1月1日」という形式で、これをパディングして「2022年01月01日」に直したいときのサンプル。「月」と「日」の位置をfindで取得して、その間の数値部分をzfillするもの。「テキストの解析」や「サブテキストの取得」アクションで実装するといったい何行になってしまうだろう。

 s = '%NewVar%'
pos1 = s.find('月')
pos2 = s.find('日')
print s[0:5] + s[5:pos1].zfill(2) + '月' + s[pos1+1:pos2].zfill(2) + s[pos2:]

f:id:yujihb:20211220011947j:plain

 

意外と使いづらいデータテーブル

フローの処理のなかで一時的にテキストや数値を格納しておくために自分で変数を定義することが通常だ。多くの場合、単一の値を格納する変数か、または複数行を格納できるリスト変数を定義することと思う。もうひとつ、さらにリスト変数よりも次元がひとつ増えた行と列をもつ2次元のテーブルを変数として扱うこともできる。エクセルやCSVのデータを取得したり、ウェブサイト上のテーブルを取得する際などに登場する。

例えばtenki.jpにある降水確率などがはいったデータテーブルを取得してみる。

f:id:yujihb:20211208013719j:plain

アクション「Webページからデータを抽出する」を作成する。これには前提としてブラウザーインスタンスが必要なのでフォアグラウンドウインドウを取得しておく。

f:id:yujihb:20211208013955j:plain

アクション「Webページからデータを抽出する」ではブラウザーインスタンスや出力する変数などを指定する。

f:id:yujihb:20211208014425j:plain

上記フローを実行すると、右ペインのフロー変数のなかのDataFromWebPage変数に行と列の数が表示された。

f:id:yujihb:20211208014544j:plain

DataFromWebPage変数のなかみはこのように2次元のテーブルとなっている。変数のタイプはDatatableだ。

f:id:yujihb:20211208014721j:plain

なおテーブル上の特定の位置の値を指定するには以下のように表記する。1つめの角括弧の中がテーブルの行番号、2つめの角括弧の中がテーブルの列番号だ。

%DataFromWebPage[1][1]%

f:id:yujihb:20211208015614j:plain

上記を実行するとDataFromWebPage変数の中の1行1列目の値が取得できる。

f:id:yujihb:20211208015912j:plain

ウェブサイトの情報がほぼそのままキレイにデータテーブルに格納されるのですごく便利そうにみえる。いろいろと使いやすそうにみえる。しかし一方でデータ取得はできるものの、意外とこれがPower Automate for Desktop上では扱いづらい。2次元のテーブル上の値を操作するアクションがあまりないことが理由だ。

取得したテーブルの列を切り出してリスト変数にすることは、それ専用のアクションがあり簡単にできる。しかし逆にアクションを駆使して新たにテーブルを生成することは難しい。リスト変数を一つの列と考えて複数のリスト変数を横に並べてくっつけてテーブルにする、といったことができそうでいて簡単にできない。

他には2次元データをソートをしたいときにも問題に直面する。エクセルではワンクリックでテーブルの一つの項目をもとにテーブル全部をソートできるが、Power Automate for Desktopではすんなりできず工夫が必要となる。工夫すると可能ではあるが、単にテーブルをソートをしたいだけなので車輪の再発明をしている気分になってくる。実はもっと簡単にできるんじゃないかという疑念と戦いながら工夫をこらしていくのはとっても精神に悪い。Power Automate for Desktopはソートは不得意なのでできればエクセルにデータを渡してエクセルで処理するとよい。

正規表現でAND(かつ)を入力して複数条件で検索

よく使う正規表現のひとつ。テキスト内に複数の文字列がすべて含まれているかどうか確認したいときがある。その場合は以下のように入力する。

 

^(?=.*%Var1%)(?=.*%Var2%)

 

とくに工夫せず標準的にアクションを使う場合、複数条件を満たすことを検査するためには複数行のアクションが必要となる。正規表現で一発でかけるとアクション数が減ってよい。以下のようにアクション「テキストの解析」などで使える。

 

変数ClipboardTextのなかに変数Var1と変数Var2の両方の文字列が含まれているかを検査する場合。

f:id:yujihb:20211116000247j:plain

上記を実行して条件に合致した場合は変数Positionに0(ゼロ)が格納される。合致しない場合は-1が格納される。

f:id:yujihb:20211116000433j:plain

さらに後ろに「(?=.*%Var3%)」等をたくさんつなげて条件を3つ以上に増やすこともできる。

f:id:yujihb:20211116000328j:plain