Страницы: 1
RSS
PQ разделить столбцы по разделителю согласно списка столбцов, Разделить столбцы
 
Добрый день!
Подскажите пожалуйста, как в Power Query разделить столбцы по разделителю. Есть таблица, в ней данные разделены ":". Создал список из наименований столбцов, записал функцию по разделению столбцов, как теперь нужно создать цикл, чтобы разделение столбцов происходило согласно этого списка?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    lst1 = Table.ColumnNames(Источник),
    f=(z) => Table.SplitColumn(Источник, z, Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv),2),
    R = f(lst1{1})
in
    R
 
А не проще создать столбец сведения, в котором объединить все столбцы с этим же разделителем и потом этот столбец разбить?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Объединенные столбцы" = Table.CombineColumns(Источник,Table.ColumnNames(Источник),Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Сведено"),
    #"Разделить столбец по разделителю" = Table.SplitColumn(#"Объединенные столбцы", "Сведено", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"Сведено.1", "Сведено.2", "Сведено.3", "Сведено.4", "Сведено.5", "Сведено.6", "Сведено.7", "Сведено.8"})
in
    #"Разделить столбец по разделителю"
для универсальности(если столбцов будет разное кол-во, но в каждом будет всегда по два значения), можно так:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    combine_cols = Table.CombineColumns(Источник,Table.ColumnNames(Источник),Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Сведено"),
    col_cnt = List.Count(Table.ColumnNames(Источник))*2,
    split_cols = Table.SplitColumn(combine_cols, "Сведено", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), col_cnt)
in
    split_cols
Изменено: Дмитрий(The_Prist) Щербаков - 01.09.2021 15:30:42
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я уже так думал, но хотелось просто понять, есть или нет способ который выполнял именно подобие цикла, т.к. не всегда список будет состоять из полного списка наименований, да и с переименовыванием столбцов заморачиваться не надо.
Кстати, Ваш вариант выдает ошибку если будет так, чтобы исправить придется добавлять в пустые ячейки просто разделитель
Изменено: Msi2102 - 01.09.2021 15:39:45
 
Цитата
Msi2102 написал:
Ваш вариант выдает ошибку если будет так
а что за ошибка? У меня не выдает ошибок, все формируется нормально. Плюс я выше приложил более универсальный вариант - если столбцов будет "плавающее" кол-во.
Цитата
Msi2102 написал:
не всегда список будет состоять из полного списка наименований
вообще не понял, что это значит. Каких именно наименований?
Цитата
Msi2102 написал:
да и наименованием столбцов заморачиваться не надо
это в какой момент не надо будет? Вам в любом случае надо будет обращаться так или иначе ко всем столбцам и в любом случае придется определять кол-во вхождений текста, если их там не всегда 2.
Изменено: Дмитрий(The_Prist) Щербаков - 01.09.2021 15:39:57
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
вхождений текста, если их там не всегда 2
Количество всегда 2, поэтому не придется заморачиваться с переименованием столбцов в конечном результате
Цитата
Дмитрий(The_Prist) Щербаков написал:
Каких именно наименований
Я создал список из наименований столбцов, но возможно просто {"Январь", "Март"}
Цитата
Дмитрий(The_Prist) Щербаков написал:
а что за ошибка?
Если к примеру в последней строке в столбце январь будут отсутствовать данные, тогда придется их заполнять разделителем (":"), иначе результат вставляется не в те ячейки
Изменено: Msi2102 - 01.09.2021 15:48:09
 
Так бы и написали, а то "выдает ошибку" :) Работает не так, как Вы ожидали и выдает ошибку - очень разные вещи.
Цитата
Msi2102 написал:
в последней строке в столбце январь будут отсутствовать данные, тогда придется их заполнять разделителем (":"), иначе результат вставляется не в те ячейки
я с Вас удивляюсь...А в чем проблема-то?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    col_names = Table.ColumnNames(Источник),
    rep_val = Table.ReplaceValue(Источник,null,":",Replacer.ReplaceValue,col_names),
    combine_cols = Table.CombineColumns(rep_val,col_names,Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Сведено"),
    col_cnt = List.Count(Table.ColumnNames(rep_val))*2,
    split_cols = Table.SplitColumn(combine_cols, "Сведено", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), col_cnt)
in
    split_cols
другой вопрос, что Вам может принципиально надо какой-то цикл по столбцам. Тогда надо думать, потому что сходу не понимаю зачем такие заморочки, когда можно все решить более чем просто...
Изменено: Дмитрий(The_Prist) Щербаков - 01.09.2021 15:56:45
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
другой вопрос, что Вам может принципиально надо какой-то цикл по столбцам
именно, хотелось просто понять есть такая возможность, запустить функцию в цикле, что-то типа R =  each f(lst1{_})
 
Msi2102, так получилось
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    lst1 = Table.ColumnNames(Источник),
    lst2 = List.Skip(lst1,2),
    Custom1 = List.Accumulate(lst2,Источник,(z,z2) => Table.SplitColumn(z, z2, Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv),2))
in
    Custom1
 
Доброе утро!
Михаил Л, Дмитрий(The_Prist) Щербаков, большое спасибо за отклики, прошу прощения, что вчера не смог ответить, как-то навалилось всё под вечер.
Цитата
Дмитрий(The_Prist) Щербаков написал:
не понимаю зачем такие заморочки
Дмитрий, я просто хотел понять, есть такая возможность или нет. В PQ не силен, поэтому скорее всего аналогичную задачу решал бы именно Вашим способом, только пришлось бы ещё добавить проверку ячейки на наличие в ней разделителя и при его отсутствии добавлять его в конец или начало текста. Но мне кажется, что это все-таки костыльный метод.
Цитата
Михаил Л написал:
так получилось
Михаил, спасибо за данный вариант. Умом я понимал, что нужно именно List.Accumulate, но не додумался как прикрутить.
А вообще, я гляжу, с помощью этой функции можно решать 50% задач на PQ, если не больше.  
Изменено: Msi2102 - 02.09.2021 08:12:14
Страницы: 1
Наверх