やりたいこと
Power Automateで改行コードを削除したり、改行コードで分割したりしたい。
例えば
apple
banana
cherry
grape
kiwifruit
melon
こんなの感じのプレーンテキストを
[
apple,
banana,
cherry,
grape,
kiwifruit,
melon
]
な感じで改行コードで分割した配列に変換したい。
考え方と課題
分割といえばsplit関数ですね。
Power Automateにもあります!
関数さえあればそれを使うだけ、超簡単!
かと思いきや。。。
改行コードってどうやって入力するんだ?
という問題に直面します。
\nとかやってみても、そのまま\nって文字に解釈されてしまってエスケープシーケンスが効かないという罠が。。。
さらに、改行コードと一言でいっても、LF(Line Feed)か、それともCR(Carrige Return)も付いて来るのか?
という問題も出てきます。
入力側が単一の環境に限定されているならば、改行コードも特定できるので楽なんですが、Power AutomateをWebServiceっぽく使ってたりするとどんな改行コードが来るかはわからないですよね。
OSとかブラウザなりその他のクライアントなり、送信元が特定できない以上はなにがきてもおかしくない!
そんなわけで、
改行コードを定義しつつ、それをPower Automateで扱える形式で表現
する必要があるということがわかりました。
実践
改行コードを定義する(決める)
LFだけなのか、それともCRも付いて来るのか・・・わからないのであれば、片方に寄せればいい!
ということで、前処理でCRはあったら消しておく。
これで以後の処理本体では改行コードはLFと定義することができるようになります。
改行コードをPower Automateで表現する
Power Automateの式ではエスケープシーケンスが効きません。
なので他の方法を探ります。
この記事を書く前に検索してみました。
Microsoft Flow上で複数行文字列を改行で分割する
この記事では改行のみを含む変数を定義してそれを使うという技を使っているようでした。
これで解決する場合はシンプルで良さそう!
しかし、改行コードがCRLFなのかLFなのかわからん。。。ということで、自前で改行コードを用意することにしました。
Power Automateでは文字コードの表現方法として
- UriComponent
- Base64
- DataUri
あたりが使えるらしい。
この中から、CRとLFが表現できれば良いのでUriComponentを使うことにします。
| 表現したいもの | 文字コード | UriComponent | Power Automate上での表現 |
|---|---|---|---|
| CR | 0x0d | %0D | decodeUriComponent('%0D') |
| LF | 0x0a | %0A | decodeUriComponent('%0A') |
完成
split(replace({分割対象文字列},decodeUriComponent('%0D'),''),decodeUriComponent('%0A'))
replace(replace({除去対象文字列},decodeUriComponent('%0D'),''),decodeUriComponent('%0A'),'')
おまけ(2020/10/14追記)
アダプティブカードとかで改行したい場合は「\n\n」に置きかえるとよいです。
「\n」にしても「CR」や「LF」「CRLF」どれにしても改行されずに困り果て、ふと「本家のAdaptive Cardデザイナ使ったらどうなるんだろうか」と思い立ってやってみました。
ビンゴ!これで改行がどう表現されているかわかりました。