Splitter 7 - Splitter.SplitTextByPositions, Splitter.SplitTextByRanges или и вот так тоже можно
#АнатомияФункций - Splitter.SplitTextByPositions, Splitter.SplitTextByRanges
Всем привет!
Завершая тему сплиттеров, рассматриваем следующих пациентов:
Первый аргумент – список, второй необязательный позволяет смотреть с конца. Базовые примеры можно посмотреть в справке – там особо обсуждать нечего. А вот интересненькое давайте порешаем.
Кейс 1 – разобрать текст, не затирая теги (или по простому – поделить текст по позициям одного разделителя и по позициям следующим за другим разделителем):
Кейс 2 – пишем отсутствующий в 2016 Splitter.SplitTextByCharacterTransition:
Кейс 3 – делим текст по цифро-дефисовой последовательности, заканчивающейся точкой:
Кейс 4 – эту задачку мы уже разбирали – только теперь решим её по-другому и выясним, что Splitter.SplitTextByRanges никакой не сплиттер, а профессиональный «выниматель подстрок» :
Как вы догадываетесь, подробное описание того, что тут к чему, смотрим на Ютубе
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik
#АнатомияФункций - Splitter.SplitTextByPositions, Splitter.SplitTextByRanges
Всем привет!
Завершая тему сплиттеров, рассматриваем следующих пациентов:
Splitter.SplitTextByPositions(positions as list, optional startAtEnd as nullable logical)
Splitter.SplitTextByRanges(ranges as list, optional startAtEnd as nullable logical)
Первый аргумент – список, второй необязательный позволяет смотреть с конца. Базовые примеры можно посмотреть в справке – там особо обсуждать нечего. А вот интересненькое давайте порешаем.
Кейс 1 – разобрать текст, не затирая теги (или по простому – поделить текст по позициям одного разделителя и по позициям следующим за другим разделителем):
let
txt= "<info><recnumber=1 type=A date=12.04.2012><name><first>Имя1</first><last>Фамилия1</last><medium>Отчество1</medium></name><doc><type>паспорт</type><number>23465</number></doc></info><info><recnumber=2 type=D date=15.04.2012><name><first>Имя2</first><last>Фамилия2</last><medium>Отчество2</medium></name><doc><type>св-во</type><number>98745</number></doc></info>",
pos = Text.PositionOf(txt,"<",Occurrence.All),
pos1 = List.Transform(Text.PositionOf(txt,">",Occurrence.All),(x)=>x+1),
lst = List.Sort(List.Distinct(pos&pos1)),
splt=Splitter.SplitTextByPositions(lst)(txt),
to = List.Select(splt,(x)=>Text.Trim(x)<>"")
in
to
Кейс 2 – пишем отсутствующий в 2016 Splitter.SplitTextByCharacterTransition:
let
txt = "картошка 123морковка 29свёкла 11лук 14чеснок 13",
lst = Splitter.SplitTextByRepeatedLengths(1)(txt),
zip = List.Zip({lst,{""}&List.RemoveLastN(lst,1)}),
f=(x)=>Text.Contains("0123456789",x),
g=(x)=>not f(x{0}) and f(x{1}),
pos = List.PositionOf(zip,g,Occurrence.All,(c,v)=>v(c)),
to = Splitter.SplitTextByPositions(pos)(txt)
in
to
Кейс 3 – делим текст по цифро-дефисовой последовательности, заканчивающейся точкой:
let
txt = "1. Текст 1-1. Текст с пробелами 1-2. текст с числами 123 2. ещё текст 3. текст. 4. а текст-то бывает разный... издевательство 5. например с числами 2.5 12. и номеров много 123. очень много 1234. прям совсем",
f=(x)=>Text.Contains("0123456789.-",x),
g=(x)=>Text.Contains("0123456789",x),
lst=Splitter.SplitTextByRepeatedLengths(1)(txt),
tbl = Table.FromList(lst,(x)=>{f(x),g(x),x="."},{"flag","num","dot"}),
add = Table.AddIndexColumn(tbl,"ind"),
gr = Table.Group(add,"flag",{{"pos",(x)=>x{0}[ind]},{"dot",(x)=>List.Last(x[dot])=true},{"nums",(x)=>List.AnyTrue(x[num])}},GroupKind.Local),
pos = Table.SelectRows(gr,(x)=>x[dot] and x[nums])[pos],
to = Splitter.SplitTextByPositions(pos)(txt)
in
to
Кейс 4 – эту задачку мы уже разбирали – только теперь решим её по-другому и выясним, что Splitter.SplitTextByRanges никакой не сплиттер, а профессиональный «выниматель подстрок» :
let
from = Excel.CurrentWorkbook(){[Name="Таблица110"]}[Content],
f=(x)=>[a=Splitter.SplitTextByRepeatedLengths(1)(x),
b=(x)=>Text.Contains("0123456789 ",x),
c=List.Zip({a,{""}&List.RemoveLastN(a,1)}),
d=Text.PositionOf(x,"бит/с",Occurrence.Last),
e=List.PositionOf(c,null,Occurrence.All,(c,v)=>b(c{0}) and not b(c{1})),
f=List.Max(e,null,(x)=>if x > d then 0 else x),
g={{0,Text.Length(x)},{f,d-f-2},{d-1,6}},
z=Splitter.SplitTextByRanges(g)(x)][z],
splt = Table.SplitColumn(from,"Custom",f,{"Custom","скока","чего"}),
to = Table.TransformColumns(splt,{"скока",Number.From})
in
to
Как вы догадываетесь, подробное описание того, что тут к чему, смотрим на Ютубе
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik