Доброго времени суток всем. Подскажите пожалуйста как можно разложить смешанные данные одного столбца на два столбца согласно критерию. Пример: в столбце последовательно расположены данные по наименованию производителя и его коды. Необходимо в Power Query получить 2 столбца в первом должны быть наименования производителя, во втором его коды. Для лучшего понимания приложил картинку примера с результатом.
если коды состоят только из цифр без начальных нулей
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Custom = Table.AddColumn(Source, "a", each Number.From([Столбец1])),
Replace = Table.ReplaceErrorValues(Custom, {{"a", null}}),
Columns = Table.AddColumn(Replace, "b", each if [a] = null then [Столбец1] else null)[[b],[a]]
in
Columns
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
#"Переименованные столбцы" = Table.RenameColumns(Источник,{{"Столбец1", "Производитель"}}),
#"Строки с примененным фильтром" = Table.SelectRows(#"Переименованные столбцы", each ([Производитель] <> null)),
#"Дублированный столбец" = Table.DuplicateColumn(#"Строки с примененным фильтром", "Производитель", "Код"),
Преобразуем = Table.TransformColumns(#"Дублированный столбец",
{{"Код",each if List.ContainsAny(Text.ToList(_),{"0".."9"}) then _ else ""},
{"Производитель", each Text.Remove(_,{"0".."9"})}})
in
Преобразуем
let
Source = Table.FromColumns({{"Almogaver", "18019", "Dupont", "18005"}}, {"Производитель/Код"}),
Transform = Table.TransformColumns(Source, {{"Производитель/Код", each [Производитель = try Number.From(_) * null otherwise _, Код = if Производитель = null then _ else null], type record}}),
Out = Table.FromRecords( Transform[#"Производитель/Код"] )
in
Out
Всем большое спасибо что откликнулись на мою просьбу. Я сглупил не вложив экселевский файл, а так как я не столь грамотный в вопросах Power Query человек, мне тяжело подвязать код в моему примеру.))) Вот файл.
let
Source = Table.RenameColumns(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],{{"Производитель/код","a"}}),
Group = Table.Group(Source, {"a"}, {{"b", each _[a]}},0,(a,b)=>1-Number.From(Value.Is(try Number.From(b[a]) otherwise null,type number)))[[b]],
Split = Table.SplitColumn(Group,"b",(a)=>{a{0},List.Skip(a,1)},{"Производитель","Код"}),
Ret = Table.TransformColumnTypes(Table.ExpandListColumn(Split,"Код"),{{"Код", type number}})
in
Ret
Еще раз большое спасибо всем кто откликнулся на мой вопрос. Я абсолютный новичок в Power Query, но сегодня у меня все получилось приобщил код к своему файлу. Все заработало.
Андрей Лящук, спасибо за 3 аргумент Table.SplitColumn. Давно собирался с ним поковыряться, найти альтернативу дефолтным сплиттерам, так и не собрался. Свои 5 копеек:
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
split = Table.SplitColumn(Source, "Производитель/код", (x)=>let a = try Number.From(x) otherwise null
in {if a = null then x else null, a},
{"Производитель", "Код"})
in
split
Доброго времени суток. Если можно то, еще раз для особо одаренных Нужно разбить 4й столбец на 3: 1. содержит раздел 2. вид работ 3. только число (сквозной порядковый номер)
lord_21 написал: Если можно то, еще раз для особо одаренных
А чего ж нельзя то, вариант на базе решения от Aleksei_Zhigulin в посте 10.
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
split = Table.SplitColumn(
Source,
"Столбец4",
(x)=>let a = try Number.From(x) otherwise null
in { if Text.StartsWith( Text.Combine({x,""}), "Раздел") then x else null, if (not Text.StartsWith( Text.Combine({x,""}), "Раздел") ) and a = null then x else null, a},
{"содержит раздел", " вид работ", "только число"})
in
split