Страницы: 1
RSS
Как преобразовать в PQ число в текстовом виде (с символами) в нормальное число
 
Помогите разобраться, как правильно написать функцию в Power Query для того чтобы сделать вот такое преобразование текста в число.
На входе есть такой формат "числа":
17K
33.5K
1.95M
15M
3.95B и так далее.
Надо чтобы при выгрузке числа былы в нормальном виде
17 000
33 500
1 950 000
15 000 000 и т.д.
Сложность возникла в том, что после точки может быть разное количество символов и я не знаю, какие и в каком сочетании надо использовать встроенные функции языка М.
Спасибо.
Если не можешь победить беспорядок, то надо возглавить его.
 
Александр Медведев, не PQ, вдруг достаточно будет преобразовать исходные данные и потом работать уже в PQ, правда начнутся косяки с огромным числами...
Код
Sub mrshkei()
Dim arr, arr2, i As Long, lr As Long, n As Long, x As Double
lr = Cells(Rows.Count, 1).End(xlUp).Row
ar1 = Array("K", "M", "B", "T", "q", "Q", "s", "S", "O", "N", "d", "U", "D")
ar2 = Array(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39)
arr2 = Range("A2:A" & lr)
For i = LBound(arr2) To UBound(arr2)
    For n = LBound(ar1) To UBound(ar1)
        If InStr(arr2(i, 1), ar1(n)) > 0 Then
          arr2(i, 1) = CDbl(Replace(Replace(arr2(i, 1), ar1(n), ""), ".", ",")) * 10 ^ ar2(n)
        End If
    Next n
Next i
Range("C2").Resize(UBound(arr2), 1) = arr2
End Sub
Изменено: Mershik - 02.05.2021 08:17:24
Не бойтесь совершенства. Вам его не достичь.
 
Код
= Table.TransformColumns(Источник, {{"Показатель", each 
if Text.End(_, 1)="K" then 1000*Number.From(Text.Replace(Text.Start(_,Text.Length(_)-1),".",",")) else
if Text.End(_, 1)="M" then 1000000*Number.From(Text.Replace(Text.Start(_,Text.Length(_)-1),".",",")) else
if Text.End(_, 1)="B" then 1000000000*Number.From(Text.Replace(Text.Start(_,Text.Length(_)-1),".",",")) else
Number.From(Text.Replace(_,".",","))  }})
Изменено: Михаил Л - 02.05.2021 08:28:33
 
Благодарю вас!

И тот и тот вариант подходит.Найду применение обоим.
Если не можешь победить беспорядок, то надо возглавить его.
 
del
Изменено: buchlotnik - 23.08.2021 15:46:29
Соблюдение правил форума не освобождает от модераторского произвола
 
Михаила Л, как обычно появился еще один вопрос в продолжение)

Как ваш запрос преобразовать в функцию, чтобы можно было одним шагом преобразовать сразу несколько столбцов?
Как в ней задать в качестве входного параметра таблицу и имена столбцов в ней (4 столбца)?
Таблиц подгружается довольно много из интернета и в каждой несколько столбцов с таким форматом цифр.
Если не можешь победить беспорядок, то надо возглавить его.
 
Цитата
Александр Медведев написал:
Как ваш запрос преобразовать в функцию
так а мой вариант чем не функция?
Соблюдение правил форума не освобождает от модераторского произвола
 
Обновил страницу, после того как написал второй вопрос)

[Name="Данные"] - имя таблицы источника каждую загрузку разное
"Показатель" - название столбца фиксированное, но их 4 штуки. Все названия разные
Изменено: Александр Медведев - 02.05.2021 10:14:06
Если не можешь победить беспорядок, то надо возглавить его.
 
del
Изменено: buchlotnik - 23.08.2021 15:46:19
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Александр Медведев написал:
таблицу и имена столбцов в ней (4 столбца)
Можно, опять же, лбом
Код
= Table.ReplaceValue(Источник,1000000,1000000000,(a,b,c)=>
if Text.End(a, 1)="K" then 1000*Number.From(Text.Replace(Text.Start(a,Text.Length(a)-1),".",",")) else
if Text.End(a, 1)="M" then b*Number.From(Text.Replace(Text.Start(a,Text.Length(a)-1),".",",")) else
if Text.End(a, 1)="B" then c*Number.From(Text.Replace(Text.Start(a,Text.Length(a)-1),".",",")) else
Number.From(Text.Replace(a,".",",")) 
,Table.ColumnNames(Источник))
 
del
Изменено: buchlotnik - 23.08.2021 15:46:06
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, мне таки не удалось прикрутить вашу функцию к моим данных.
Последний раз уже тогда.
И буду изучать пример Михаила и вашу функцию + особенности создания функций как таковых.
Ваш вариант не самый простой для меня, но думаю справлюсь.
Вот нормальный пример.
В нем пять колонок, с именами Раз, Два, ... Пять, значения в которых надо преобразовать.
Если не можешь победить беспорядок, то надо возглавить его.
 
del
Изменено: buchlotnik - 23.08.2021 15:45:55
Соблюдение правил форума не освобождает от модераторского произвола
 
И правда. Все просто оказалось)
Сказалось отсутствие достаточного опыта в этом деле.

Благодарю Mershik,  Михаил Л и buchlotnik за три варианта решения моего вопроса!
Век живи, век учись.

Вопрос закрыт.
Если не можешь победить беспорядок, то надо возглавить его.
 
buchlotnik,
божественно ) Как всегда
Страницы: 1
Наверх