Есть столбец в котором в отдельных строках крайние правые значения текста содержат числа (1,0 0,5 0,4 и т.д). Мне нужно извлечь их в отдельную колонку.
Я пробую это сделать следующим образом, так как знаю что в "Column1" находится группировка по которой я могу отсечь строки в которых искать не нужно (хотя в 1% в отобранных строках колонки "Column2" не будет числовых значений).
Попробовал - выдает null.
Как можно решить задачу?
Код
Add = Table.AddColumn(Sourse, "Объем", each if [Column1] = "Со значениями" then Text.End ([Column2], 4) else null)
UPD В принципе получилось в два шага - извлечение крайних правых четырех символов из всех строк с изменением свойства на числовые (где текст появилась ошибка), а потом добавлением еще одного столбца с условием что значение больше нуля (try ... otherwise). Но хотелось бы правильнее.
let
Sourse = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Add = Table.AddColumn(Sourse , "Объем_", each if [Column1] = "Группа1" then [Column2] else null),
Split = Table.SplitColumn(Add, "Объем_", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Объем.1", "Объем"}),
Transform = Table.TransformColumns(Split,{{"Объем", each Text.Trim (_, {"(", ")" , "а".."я", "А".."Я", "ё", "+", "-", "/", " "}), type text}}),
Types = Table.TransformColumnTypes(Transform,{{"Объем", type number}}),
Remove = Table.RemoveColumns(Types,{"Объем.1"})
in
Remove
Upd Но оно не будет работать если в Column2 будут по каким то причинам появляться знаки в последней группе текста перед пробелом не указанные в списке, или необходимые данные получат размерность через пробел. Также работать будет только после группировки по "Группа1"
Михаил Л, Плохо что этот список ( "(", ")" , "а".."я", "А".."Я", "ё", "+", "-", "/", " " ) может быть длинным. Понятно что его можно вынести в справочник. Но как то тяжеловато получается.
Михаил Л, Спасибо Text.Remove работает как и Text.Trim (в первом нужно указать справочник замены, во втором при отсутствии справочника удаляет только пробелы).
let
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
fn=(t)=> [ a = Text.AfterDelimiter(Text.From(t, "ru-RU"), " ", {0, RelativePosition.FromEnd}),
b = Text.ToList(a),
c = List.Select(b, each List.ContainsAny({_},{"0".."9"}&{","})),
d = Number.From(Text.Combine(c))][d],
add = Table.AddColumn(from, "Объем", each if [Column1] = "Группа1" then fn([Column2]) else null)
in
add
Соблюдение правил форума не освобождает от модераторского произвола
PooHkrd, да, как-то про текстовый я и забыл, только зпт добавить:
Код
let
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
fn=(t)=> [ a = Text.AfterDelimiter(Text.From(t, "ru-RU"), " ", {0, RelativePosition.FromEnd}),
b = Number.From(Text.Select(a, {".",",","0".."9"}))][b],
add = Table.AddColumn(from, "Объем", each if [Column1] = "Группа1" then fn([Column2]) else null)
in
add
let
Sourse = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
LastNum = Table.AddColumn(Sourse, "LastNum", each
[a=Text.ToBinary(Text.From([Column2]),0),
b=List.RemoveLastN(Binary.ToList(a),(_)=>not((_>47 and _<58) or _=44)),
c=#binary(List.LastN(b,(_)=>(_>47 and _<58) or _=44)),
d=Number.From(Text.FromBinary(c))][d],
type number
)
in
LastNum
Максим Зеленский, это вкусовщина, я думаю. Лично мне так удобнее писать с отступами, когда переменных в записи будет 2 и более штук. Если переменная одна, то пишу с let in в одну строку, если переменных много то пишу в виде записи, каждую с новой строки, а т.к. уже привык для let и in выделять отдельные строки, а в форме записи строчек получается по-меньше при оформлении. Как-то так.