MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

アルファベットと数字が入り乱れた文字列から、数字だけ抜き取る方法 (Power Automate)

Power Automate系の小ネタです。

例えばそれぞれ長さが変動するアルファベットN文字と数字M文字の組み合わせからなる文字列があったとします ( AVFGHSGFGDF4543667475 みたいな)。

ここから、数字部分だけを抜き出す方法を2つ書き残しておきます。(結果としては4543667475が欲しい)

方法1 : ごり押しのreplace

replace関数は、replace(文字列, '置き換える文字列' , '置き換え先の文字列') の書式で、文字列の置換ができる関数です。

replace('ABCD', 'AB', '12') --> 12CD

こんな感じ。

これを使って、以下のステップで数字のみを抜き出します。なお、アルファベットと数字が連続している前提です。

  1. もとの文字列に対して、数字をすべて空文字で置換 (つまり数字を消去)する
  2. できた文字列はアルファベット部分なので、元の文字列のうち、アルファベット部分を、空文字で置換する

です。 Power Automateの式にすると

replace(元の文字列, replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(元の文字列,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9',''),'')

大変気持ち悪いですが、これで一応うまくいきます。

f:id:mofumofu_dance:20200609224610p:plain

この方法が唯一マシなのは、対象が配列の中の1つのプロパティであった場合でも対応可能なところです。その場合、Selectアクションで、なんらかのプロパティを上の「元の文字列」にあてがえばよいです。

方法2 : Select + Join

もう一つはもう少しインテリジェント(?)な感じです。 この方法の基本になるのは、文字列の1文字ずつの分割です。 (下記ブログ参照)

qiita.com

やることは、Selectアクションの Fromに、0から始まる元の文字数分だけの数字の配列を作り、Mapを工夫して、1文字ずつに分割された配列のうち、数字だけ残す。 その後Joinで結合です。

f:id:mofumofu_dance:20200609225407p:plain

1. SelectのFrom部分

これは元のブログと同じです。

range( 0 ,  length( 元の文字列) )

これで [0,1,2,3,4....,(N+M-1)] な数字の配列が出来上がります。

2. Select のMap

この配列を対象としてMap(どういう配列を生成するか)を決めます。

first(
  intersection(
    createArray('0','1','2','3','4','5','6','7','8',9), 
    array(substring(元の文字列, item(),1))
  )
)

Mapに入れるのは上の式です。

createArray()は ['0','1','2','3','4','5','6','7','8','9'] の文字列の配列を作っています。

array(substring(元の文字列, item(),1)) では、元の文字列のX番目の文字列を1つ抜き出して、配列を作っています。 ['A']や['1']のような。

intersection()は、2つの配列で共通部分のみを取り出してくれる関数です。 つまり、ここでやっていることは、 ['0','1','2','3','4','5','6','7','8','9']['A'] や ['1'] などの共通部分 (つまり数字部分)のみ抜き出す。 ということです。

intersectionの結果は必ず配列になるので、firstをとって、値にしておきます。

このアクションの結果は、下図のようになります。もともとアルファベットだった部分はnullに、数字はそのままです。

f:id:mofumofu_dance:20200609230709p:plain

3. 最後は結合

Joinでは、そのまま、配列の要素をくっつけたいので、nullで結合します。

f:id:mofumofu_dance:20200609230900p:plain

これでめでたく数字だけの文字列が抜き出せました!

f:id:mofumofu_dance:20200609231003p:plain

この方法がいいところは、数式のうち間違えがほとんどないところです。 replace多重は、かっこの数とかで、何回かエラーになります。。 ただ、オブジェクト配列を相手にしようと思うと結局ループが必要なので、微妙です。

まとめ

適材適所という感じで、使い分ければ、比較的簡単に、不要文字列の除去はできます。お試しあれ~