0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power Query へそのゴマAdvent Calendar 2024

Day 18

Power Query へそのゴマ 第18章 比較関数、置換関数

Last updated at Posted at 2024-12-17

この章では、Power Queryのデータ操作で重要な役割を果たす以下の4つの機能について詳しく解説します。

  1. 比較関数(Comparer)
  2. 置換関数(Replacer)
  3. 結合関数(Combiner)
  4. 分割関数(Splitter)

これらは、テキスト操作、データ変換、データの分割と結合など、さまざまなデータ処理において基盤となる機能です。それぞれの詳細な説明と応用例を示します。

18.1 比較関数(Comparer)

18.1.1 比較関数とは

コンペアラーは、Power Queryで値を比較するためのルールを定義する機能です。テキストデータの比較やソートの基準を柔軟に設定する際に利用されます。

この関数は、以下の関数の中で使用されます。

  • テキスト関数
    • Text.Contains
    • Text.StartWith
    • Text.EndWith
  • リスト関数
    • List.Sort
    • List.Max
    • List.Min
    • List.RemoveMatchingItems
  • テーブル関数
    • Table.Sort
    • Table.Max
    • Table.Min
    • Table.Group

18.1.2 比較関数の種類

デフォルトの比較関数は、以下の4つです。

1. Comparer.Equals

構文
Comparer.Equals(
    comparer as function, 
    x as any, 
    y as any
) as logical
  • 2つの値の等価性を比較し、論理値(true or false)を返します。
  • 3つの引数が必要で、組み込みの結合関数 Comparer.Ordinal, Comparer.OrdinalIgnoreCase, Comparer.FromCulture を指定することができます。
let
    myTable = Table.FromRows(
        {
            { "APPLE", "apple" },
            { "apple", "apple" },
            { "42", 42.0 },
            { 42, 42.0 }
        }
    ),
    equivalenceChecks = Table.AddColumn( myTable,
        "equivalenceCheck",
        each Comparer.Equals(
            Comparer.FromCulture("en-US", true),
            [Column1],
            [Column2]
        ), type logical
    )
in
    equivalenceChecks

値の等価性を判断するために、英語(米国)の Culture で、大文字・小文字の区別なしで比較を行っています。

image.png

2. Comparer.Ordinal

構文
Comparer.Ordinal(
    x as any, 
    y as any
) as number
  • 2つの引数値を取り比較を行います。
  • 大文字小文字を区別し、Unicode値に基づいた比較を行います。
  • 結果は -1(小さい)、0(等しい)、または 1(大きい)の値を返します。

3. Comparer.OrdinalIgnoreCase

構文
Comparer.OrdinalIgnoreCase(
    x as any, 
    y as any
) as number
  • 2つの引数を取り比較を行います。
  • 大文字小文字を無視します。、Unicode値に基づいた比較を行います。
  • 結果は -1(小さい)、0(等しい)、または 1(大きい)の値を返します。
  • 例: "Apple""apple" は同じ値として扱われます。

4. Comparer.FromCulture

構文
Comparer.FromCulture(
    culture as text, 
    optional ignoreCase as nullable logical
) as function
  • 2つの引数を取ります。1番目は Culture 、省略可能な2番目は大文字・小文字の区別を論理値(true or false)でとります。(省略した場合は false
  • 結果は -1(小さい)、0(等しい)、または 1(大きい)の値を返します。

18.1.2 テキストの並び替え

以下の例では、Comparer.OrdinalIgnoreCase を使用して大文字小文字を無視したソートを行います。

let
    Source = {"Banana", "apple", "Apple", "banana"},
    Sorted = 
        List.Sort(
            Source, 
            Comparer.OrdinalIgnoreCase
        )
in
    Sorted

image.png

18.1.3 カスタム比較関数でグルーピング

比較処理をカスタム関数で行うことができます。

let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),


    Group = Table.Group(
        Source,
        {"Month"},
        {"total", each List.Sum([price]), type number},
        GroupKind.Global,
        (x, y) => Value.Compare(
            Number.From(Date.From("2024 " & x[Month])),
            Number.From(Date.From("2024 " & y[Month]))
        )
    )

in
    Group

image.png

18.1.4 comparisonCriteria

List.SortTable.SortList.ContainsTable.Contains などでは、comparisonCriteria を使います。これは、カスタム比較関数以外も使うことができます。

1.単一列の並べ替え

let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),

    Sorted = Table.Sort(
        Source,
        "CustomerID"
    )
in
    Sorted

CustomerIDが昇順に並び替え。

image.png

2.複数列の並べ替え

let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),

    Sorted = Table.Sort(
        Source,
        {
            {"CustomerID", Order.Ascending}, 
            {"Month", Order.Descending}
        }
    )
in
    Sorted

CustomerID が昇順、Month が降順に並び替え

image.png

3. カスタム・キー値

let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),

    Sorted = Table.Sort(
        Source,
        {
            {"CustomerID", Order.Ascending}, 
            each Date.From("2024 " & [Month])
        }
    )
in
    Sorted

CustomerID が昇順、Month がカレンダー順に並び替え。

image.png

4.カスタム比較関数

Value.Compareを使用したカスタム比較関数
let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),

    Sorted = Table.Sort(
        Source,
        (x, y)=>
            Value.Compare(
                Date.From("2024 " & x[Month]),
                Date.From("2024 " & y[Month])
            )
    )
in
    Sorted

Month がカレンダー順に並び替え。

image.png

18.2 置換関数(Replacer)

置換関数は、テキストや値を置き換えるための関数セットです。指定したルールに基づいてデータを一括変換する際に役立ちます。

18.2.1 主な置換関数

  1. Replacer.ReplaceText

    • テキスト値を別の値に置き換えます。
    構文
    Replacer.ReplaceText(
        text as nullable text, 
        old as text, 
        new as text
    ) as nullable text
    
  2. Replacer.ReplaceValue

    • 特定の値を別の値に置き換えます。
    構文
    Replacer.ReplaceValue(
        value as any, 
        old as any, 
        new as any
    ) as any
    

18.2.2 テキストの置換

以下の例では、特定の文字列を他の文字列に置き換えます。

Table.ReplaceValue構文
Table.ReplaceValue(
    table as table, 
    oldValue as any, 
    newValue as any, 
    replacer as function, 
    columnsToSearch as list
) as table
let
    Source = Table.FromRecords({
        [Name = "Alice", Score = 90],
        [Name = "Bob", Score = 85],
        [Name = "Charlie", Score = 90]
    }),
    Replaced = 
        Table.ReplaceValue(
            Source, 
            "Alice", 
            "Alicia", 
            Replacer.ReplaceText, 
            {"Name"}
        )
in
    Replaced

Name 列の "Alice""Alicia" に置換する処理をしています。

image.png

18.2.3 カスタム置換関数

let
    Source = Table.FromRecords(
        { 
            [CustomerID = 1, Month = "August", price = 20],
            [CustomerID = 2, Month = "July", price = 10],
            [CustomerID = 2, Month = "January", price = 20],
            [CustomerID = 1, Month = "November", price = 10],
            [CustomerID = 3, Month = "July", price = 20],
            [CustomerID = 3, Month = "January", price = 5]
        }, 
        type table [CustomerID = number, Month = text, price = number]
    ),

    Sorted = Table.ReplaceValue(
        Source,
        "November",  // oldValue
        "December",  // newValue
        (currentValue, oldValue, newValue)=>
            if currentValue = oldValue
                then newValue
                else currentValue,
        {"Month"}
    )

in
    Sorted

image.png

カスタム置換関数は、3つの引数をとり、ここでは currentValue, oldValue, newValue としています。(変数名は何でもよい)

image.png

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?