10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Power Automateでのソート (Loopなし)

Last updated at Posted at 2020-03-10

Power Automateでは組み込みのソート操作がありません。
このため、2018年にはApply to each (ループ)を利用したソート方法が考案されました。[1]
このほかにも、最近では、Excelのテーブルを経由してデータをソートする方法も考えられています。[2]

これらの方法を @johnnliu に教えてもらって、チャットしていたら、『新しい方法を思いついた!』[3] と言い出したので、悔しくなって自分も新しい方法を考えていた結果、ループを利用しないソートの方法が見つかったので紹介します。

###Refs

  1. How to implement Sort with Microsoft Flow in 3 actions within a loop
  2. Sort an array in Power Automate in 3 easy steps
  3. Implementing a fast sort with Microsoft Flow using Parallel Compute

ループなしソートの方法

今回は文字の配列を対象に、ソートのコンセプトを説明します。
先にFlowですが、お手軽3ステップです。こういう基本的な操作は短いほど応用効くので、いいですね。
image.png

概念というか、図にしてみると以下のような操作です。
image.png

AtoZ Array

これがソート順を決めています。今回はa~Zの昇順でソートしているのですが、逆順にする場合には[z,Z,y,Y,...,a,A]のような配列を作ればよいです。
手で配列を作るのは大変なので、文字列を1文字ずつに分割する方法 を利用します。
Selectアクションを利用していて、Fromは

range(0,length('aAbBcCdDeEfFgGhHiIjJkKlLmMoOpPqQrRsStTuUvVwWxXyYzZ'))

Mapには

substring('aAbBcCdDeEfFgGhHiIjJkKlLmMoOpPqQrRsStTuUvVwWxXyYzZ',item(),1)

を入力しています。

Filter array

概念図の操作を実現するために、Filterアクションを利用します。
FilterのFromはAtoZ Arrayです。
Conditionが最も重要ですが、

intersection(json(concat('["', item(), '"]')), outputs('Initial_Array'))?[0]

Intersectionの結果がnullでないものでフィルターします。
ちょうど上の図の点線で書いた四角をフィルターして除去しているイメージです。

[2020/3/11 追記]
Intersection()=null は、数式使わずに
条件としてひっくり返したようなcontainsで代用できました。
(From はAtoZ arrayだけど、比較するのは 未ソート配列が、item()を含むかどうか)
image.png

実行速度比較

大文字小文字を含む40文字で試してみました。
十分な速度(0s)で処理が実行できていることが分かります。
Comp.png

注意事項

このソートでは、元の配列に重複がないこと、空がないことを前提にしています。元の配列に重複がある場合には、1:NのLeft-joinをxpathを利用することで実現できますが、長くなるので次回以降ご紹介します。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?