Power BI Desktop や Excel のクエリ エディターで変換加工をするとき、不要な行の除外としてテーブルから [空白行を削除する]ことがあるのだけど、そのこと自体より クエリ エディター から出力された式が結構イケてるなぁと思ったので。
Table.SelectRows(
PreviousStep_table,
each not List.IsEmpty(
List.RemoveMatchingItems(
Record.FieldValues(_),
{"", null}
)
)
)
- テーブルの列名を参照したり指定することなく
- すべての列の値を行ごとに検証
していて、リスト(list)をうまく使う工夫だなと思うのです。
整理してから考える
関数が入れ子になっているので違う記述をしてみる。そして、順を追って考える。
Table.SelectRows(
Table_PreviousStep,
( CurrentRow ) =>
let
List_CurrentValues = Record.FieldValues( CurrentRow ),
List_RemovedValues = List.RemoveMatchingItems( List_CurrentValues, { "", null } ),
Logical_IsEmptyList = List.IsEmpty( List_RemovedValues )
in
not Logical_IsEmptyList
)
処理に必要な関数を入れ子にしなくても記述できるのです。
Record.FieldValues
Record.FieldValues(
record as record
) as list
Record.FieldValues( [ 列1 = "A", 列2 = 10 ] ) // { "A", 10 }
テーブルの各行をそれぞれ参照するとき、その値(value)の型は record。Record.FieldValues 関数 で レコードからフィールドの値だけの list に変換する。このあと、すべての列の 値だけ を参照することでことたりるし、列名などで参照することがないので、どれだけの列が存在する テーブル であっても同様の処理をすることができる。
List.RemoveMatchingItems
List.RemoveMatchingItems(
list as list,
values as list,
optional equationCriteria as any
) as list
List.RemoveMatchingItems( {"A", "B", "C", "A", "D"}, {"A", "C"} ) // {"B", "D"}
リストから特定の値のアイテムを削除する。[空白行を削除する] という処理では、長さ 0 の文字列と null をリストから削除。削除対象は、{ "", null } というリストで表現されているから、ここを変更すれば空白行とはならないけれども違った条件での[行の削除]ができるようになる。
List.IsEmpty
List.IsEmpty(
list as list
) as logical
List.IsEmpty( {"A", "B", "C"} ) // false
List.IsEmpty( {} ) // true
リストから長さ 0 の文字列 と null を削除した結果、アイテム数 0 のリストになったとき、その行のすべての列の値は、長さ 0 の文字列 と null のいずれかということなので、該当する行は"空白行"ということになる。