Power Automate系の小ネタです。
例えばそれぞれ長さが変動するアルファベットN文字と数字M文字の組み合わせからなる文字列があったとします ( AVFGHSGFGDF4543667475 みたいな)。
ここから、数字部分だけを抜き出す方法を2つ書き残しておきます。(結果としては4543667475が欲しい)
方法1 : ごり押しのreplace
replace関数は、replace(文字列, '置き換える文字列' , '置き換え先の文字列')
の書式で、文字列の置換ができる関数です。
replace('ABCD', 'AB', '12') --> 12CD
こんな感じ。
これを使って、以下のステップで数字のみを抜き出します。なお、アルファベットと数字が連続している前提です。
- もとの文字列に対して、数字をすべて空文字で置換 (つまり数字を消去)する
- できた文字列はアルファベット部分なので、元の文字列のうち、アルファベット部分を、空文字で置換する
です。 Power Automateの式にすると
replace(元の文字列, replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(元の文字列,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9',''),'')
大変気持ち悪いですが、これで一応うまくいきます。
この方法が唯一マシなのは、対象が配列の中の1つのプロパティであった場合でも対応可能なところです。その場合、Selectアクションで、なんらかのプロパティを上の「元の文字列」にあてがえばよいです。
方法2 : Select + Join
もう一つはもう少しインテリジェント(?)な感じです。 この方法の基本になるのは、文字列の1文字ずつの分割です。 (下記ブログ参照)
やることは、Selectアクションの Fromに、0から始まる元の文字数分だけの数字の配列を作り、Mapを工夫して、1文字ずつに分割された配列のうち、数字だけ残す。 その後Joinで結合です。
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に、数字はそのままです。
3. 最後は結合
Joinでは、そのまま、配列の要素をくっつけたいので、nullで結合します。
これでめでたく数字だけの文字列が抜き出せました!
この方法がいいところは、数式のうち間違えがほとんどないところです。 replace多重は、かっこの数とかで、何回かエラーになります。。 ただ、オブジェクト配列を相手にしようと思うと結局ループが必要なので、微妙です。
まとめ
適材適所という感じで、使い分ければ、比較的簡単に、不要文字列の除去はできます。お試しあれ~