Splitter 1 - Splitter.SplitByNothing или сплиттер, который "ничего не делает"

#АнатомияФункций - Splitter.SplitByNothing



Всем привет!

Итак, начинаем разбор с самого простого сплиттера.

В целом все сплиттеры представляют собой замыкания, т.е. в скобках мы передаём аргументы и на выходе получаем функцию. Чтобы эта функция заработала, ей нужно передать анализируемые данные во вторых скобках

Splitter.SplitByNothing()  //просто сплиттер как функция

Splitter.SplitByNothing()("abc") //вызов его от аргумента "abc"


Что делает данная функция? Ответ в заголовке – ничего, точнее, она ничего не делает с самим аргументом. Но! Результат разделения по своему смыслу должен порождать список значений, поэтому на самом деле функция превращает переданный ей аргумент в список из одного значения

Splitter.SplitByNothing()("abc")  //{"abc"}

Splitter.SplitByNothing()(123) //{123}

Splitter.SplitByNothing()({1,2,3}) //{{1,2,3}}


И вот теперь вопрос – зачем нужен сплиттер, который не меняет исходное значение?

В качестве примера рассмотрим задачу: в таблицу после столбца “d” нужно вставить ещё три столбца ("x","y" и "z") , заполненные нулями.

Стандартное решение через Table.SelectColumns выглядит как-то так:

let

from = #table({"a".."h"},List.Repeat({{1..8}},5)),

nms = Table.ColumnNames(from),

lst = {"x","y","z"},

tbl = Table.SelectColumns(from,List.RemoveLastN(nms,(x)=>x<>"d")&lst&List.LastN(nms,(x)=>x<>"d"),MissingField.UseNull),

to = Table.TransformColumns(tbl,List.Transform(lst,(x)=>{x,(i)=>0}))

in

to


Но ведь можно использовать и другую логику – разделить этот самый столбец "d"… просто не разделяя его:

let

from = #table({"a".."h"},List.Repeat({{1..8}},5)),

to = Table.SplitColumn(from,"d",Splitter.SplitByNothing(),{"d","x","y","z"},0)

in

to


Получается сплиттер отработал, на выход был подан список из одного значения, остальные заполнены значением по умолчанию. Получилось весьма лаконично, хотя вариант через Table.SelectColumns всё же работает быстрее.

Справедливости ради стоит отметить, что написать можно было и так

let

from = #table({"a".."h"},List.Repeat({{1..8}},5)),

to = Table.SplitColumn(from,"d",(x)=>{x},{"d","x","y","z"},0)

in

to


Или даже так

let

from = #table({"a".."h"},List.Repeat({{1..8}},5)),

to = Table.SplitColumn(from,"d",(x)=>{x,0,0,0},{"d","x","y","z"})

in

to


Т.е. вообще без сплиттера. Другое дело, что подобное решение пришло в голову только в рамках размышления о данной функции. Так что вердикт – данный сплиттер точно не бесполезен )))



Видеообзор традиционно смотрим на ютубе

Лайк, коммент, подписка приветствуются )))



Надеюсь, было полезно.

Всех благ!

@buchlotnik