この章では、Power Queryのデータ操作で重要な役割を果たす以下の4つの機能について詳しく解説します。
- 比較関数(Comparer)
- 置換関数(Replacer)
- 結合関数(Combiner)
- 分割関数(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
orfalse
)を返します。 - 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
で、大文字・小文字の区別なしで比較を行っています。
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
orfalse
)でとります。(省略した場合はfalse
) - 結果は
-1
(小さい)、0
(等しい)、または1
(大きい)の値を返します。
18.1.2 テキストの並び替え
以下の例では、Comparer.OrdinalIgnoreCase
を使用して大文字小文字を無視したソートを行います。
let
Source = {"Banana", "apple", "Apple", "banana"},
Sorted =
List.Sort(
Source,
Comparer.OrdinalIgnoreCase
)
in
Sorted
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
18.1.4 comparisonCriteria
List.Sort
や Table.Sort
、List.Contains
、Table.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
が昇順に並び替え。
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
が降順に並び替え
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
がカレンダー順に並び替え。
4.カスタム比較関数
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
がカレンダー順に並び替え。
18.2 置換関数(Replacer)
置換関数は、テキストや値を置き換えるための関数セットです。指定したルールに基づいてデータを一括変換する際に役立ちます。
18.2.1 主な置換関数
-
Replacer.ReplaceText
- テキスト値を別の値に置き換えます。
構文Replacer.ReplaceText( text as nullable text, old as text, new as text ) as nullable text
-
Replacer.ReplaceValue
- 特定の値を別の値に置き換えます。
構文Replacer.ReplaceValue( value as any, old as any, new as any ) as any
18.2.2 テキストの置換
以下の例では、特定の文字列を他の文字列に置き換えます。
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"
に置換する処理をしています。
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
カスタム置換関数は、3つの引数をとり、ここでは currentValue
, oldValue
, newValue
としています。(変数名は何でもよい)