MyTetra Share
Делитесь знаниями!
POWER QUERY. ОШИБКИ. АВТОМАТИЧЕСКОЕ УДАЛЕНИЕ ПУСТЫХ СТОЛБЦОВ
Время создания: 29.12.2021 08:45
Текстовые метки: Power Query, RemoveColumns
Раздел: !Закладки - MSO - Excel - Power Query
Запись: xintrea/mytetra_db_adgaver_new/master/base/1640756700z1oi71vy8m/text.html на raw.githubusercontent.com

    //========================================================

    let

        //source = Csv.Document(File.Contents(#"fnGetParameter"("Path_File")),[Delimiter="  ", Columns=26, Encoding=1251, QuoteStyle=QuoteStyle.None]),

        //source = Excel.Workbook(File.Contents(#"fnGetParameter"("Path_File")), null, true),

        //список имен столбцов

        List_Headers_name = Table.ColumnNames(source),

        //заменить пробелы

        Replace_Value1=Table.ReplaceValue(source," ",null,Replacer.ReplaceValue,List_Headers_name),

        //заменить пустые значения

        Replace_Value2=Table.ReplaceValue(Replace_Value1,"",null,Replacer.ReplaceValue,List_Headers_name),

        //получем профайл запроса

        tab_profile = Table.Profile(Replace_Value2),

        //столбец проверки на количество значений в столбце(вместе с шапкой)

        tab_add_col_1 = Table.AddColumn(tab_profile, "Пользовательский", each [DistinctCount]<=1),

        //отбираем строки с пустыми столбцами

        rows_select = Table.SelectRows(tab_add_col_1, each ([Пользовательский] = true)),

        //удаляем отобранные на предыдущем шаге столбцы, источник первый шаг

       cols_select = Table.RemoveColumns(source, rows_select[Column]),

        //использовать первую строку в качестве заголовков

        Promote_Headers = Table.PromoteHeaders(cols_select, [PromoteAllScalars=true]),

    in

        Promote_Headers

 

    //========================================================

    //Решение с использованием Table.Profile:

    let

       source = Excel.CurrentWorkbook(){[Name = "Данные"]}[Content],

       tab_profile = Table.Profile(source),

       tab_add_col_1 = Table.AddColumn(

          tab_profile,

          "Пользовательская",

          each [Count] = [NullCount]

       ),

       rows_select = Table.SelectRows(

          tab_add_col_1,

          each [Пользовательская] = true

       ),

       cols_select = Table.RemoveColumns(source, rows_select[Column])

    in

       cols_select

 

    //========================================================

    //Решение с использованием только пользовательского интерфейса:

    let

       source = Excel.CurrentWorkbook(){[Name = "Данные"]}[Content],

       tab_unpivot = Table.UnpivotOtherColumns(

          source,

          {"№"},

          "Атрибут",

          "Значение"

       ),

       tab_pivot = Table.Pivot(

          tab_unpivot,

          List.Distinct(tab_unpivot[Атрибут]),

          "Атрибут",

          "Значение"

       )

    in

       tab_pivot

 

 

    //Ещё один способ убрать столбцы пустые:

    (tbl) =>

    let

        Headers = Table.ColumnNames(tbl),

 

        Result = Table.SelectColumns(

                     tbl,

                     List.Select(Headers, each List.MatchesAny(Table.Column(tbl, _), each _ <> null)))

    in

        Result

        

       

    //Изящное решение от Gil Raviv (datachant.com).

 

    //Но у него не менее изящное и с использованием List.Accumulate по тому же принципу:

 

    (tbl) =>

    let

        Headers = Table.ColumnNames(tbl),

 

        fnMyAccumulator =

            (tbl as table, columnName as text) as table =>

                if List.MatchesAll(Table.Column(tbl, columnName), each _ is null) then Table.RemoveColumns(tbl, {columnName}) else tbl,

       

        myAccumulatedResult = List.Accumulate(

            Headers,

            tbl,

            (tbl, columnName) => fnMyAccumulator(tbl, columnName))

    in

        myAccumulatedResult

       

       

    //Удаление столбцов с помощью List.Accumulate:

    (tbl) =>

    let

        Headers = Table.ColumnNames(tbl),

 

        fnMyAccumulator =

            (tbl as table, columnName as text) as table =>

                if List.MatchesAll(Table.Column(tbl, columnName), each _ is null) then Table.RemoveColumns(tbl, {columnName}) else tbl,

       

        myAccumulatedResult = List.Accumulate(

            Headers,

            tbl,

            (tbl, columnName) => fnMyAccumulator(tbl, columnName))

    in

        myAccumulatedResult

 

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования