Разделить таблицу на несколько небольших таблиц на основе значения столбца - Power Query - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть такая таблица, которую я получил, используя опцию «комбинировать и редактировать» в силовом запросе, которая содержит информацию из нескольких листов из нескольких .xlsx файлов.Имена листов никогда не меняются, и они останутся прежними, файлы Excel могут измениться.

enter image description here

Теперь я хочу, чтобы многие таблицы разбивались на column1.значение firstkey.Таким образом, я могу получить несколько таких таблиц:

enter image description here

Я пытался найти ответ на Google, но все еще безуспешно.Существуют потоки типа this , которые требуют дублирования исходной таблицы и фильтрации каждого значения.

Однако, в моем случае, я хочу каким-то образом автоматизировать, если у меня есть новые .xlsx файлы.Итак, если я получу значение Brooklyn Park вместо Bursville, оно должно быть отфильтровано по значению Column1.

Как я могу сделать этот Power Query?

РЕДАКТИРОВАТЬ

По запросу, оригинальный лист Excel для одного файла,

enter image description here

M код:

let
    Source = Excel_Export,
    #"Trimmed Text" = Table.TransformColumns(Source,{{"Column1", Text.Trim, type text}}),
    #"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"Column1", Text.Clean, type text}}),
    #"Filtered Rows" = Table.SelectRows(#"Cleaned Text", each ([Source.Name] = "Burnsville.xlsx")),
    #"Transposed Table" = Table.Transpose(#"Filtered Rows"),
    #"Removed Top Rows" = Table.Skip(#"Transposed Table",1),
    #"Promoted Headers" = Table.PromoteHeaders(#"Removed Top Rows", [PromoteAllScalars=true]),
    #"Renamed Columns" = Table.RenameColumns(#"Promoted Headers",{{"Address", "Address Number"}, {"Column3", "StreetName"}, {"Column4", "City"}})
in
    #"Renamed Columns"

Я использовал этот код для создания функции автоматизации для каждого файла.

1 Ответ

0 голосов
/ 25 ноября 2018

Код M, который вы опубликовали, указывает на наличие как минимум 3 столбцов, но ваше первое изображение показывает только два столбца.Это также относится к другому запросу (Excel_Export).Я ожидал, что это покажет, как вы достигли таблицы на первом изображении, поэтому я не слишком уверен, что происходит.

Что касается вставки пустых строк, вы можете попробовать следующую функцию.

Код:

fxInsertBlankRows = (tableToTransform as table) =>
    let
        blankRowToInsert = 
            let
                headers = Table.ColumnNames(tableToTransform),
                emptyTable = Table.FromColumns(List.Transform(headers, each {""}), headers),
                toListOfRecords = Table.ToRecords(emptyTable)
            in
                toListOfRecords,
        insertionIndexes =
            let
                isolateColumn = Table.SelectColumns(tableToTransform, {"Column1"}),
                indexes = Table.PositionOf(isolateColumn, [Column1="firstKey"], Occurrence.All)
            in
                indexes,
        insertBlankRows = List.Accumulate(insertionIndexes, tableToTransform, (tableState, currentIndex) =>
                Table.InsertRows(tableState, currentIndex, blankRowToInsert)
            ) 
    in
        insertBlankRows,

Допустим, вы хотите использовать вышеуказанную функцию на шаге #"Renamed Columns" в коде M, который вы разместили (при условии, что #"Renamed Columns" - это таблица, в которой я вполне уверенявляется).Вы бы изменили способ окончания кода, как показано ниже:

#"Renamed Columns" = Table.RenameColumns(#"Promoted Headers",{{"Address", "Address Number"}, {"Column3", "StreetName"}, {"Column4", "City"}})
fxInsertBlankRows = (tableToTransform as table) =>
        let
            blankRowToInsert = 
                let
                    headers = Table.ColumnNames(tableToTransform),
                    emptyTable = Table.FromColumns(List.Transform(headers, each {""}), headers),
                    toListOfRecords = Table.ToRecords(emptyTable)
                in
                    toListOfRecords,
            insertionIndexes =
                let
                    isolateColumn = Table.SelectColumns(tableToTransform, {"Column1"}),
                    indexes = Table.PositionOf(isolateColumn, [Column1="firstKey"], Occurrence.All)
                in
                    indexes,
            insertBlankRows = List.Accumulate(insertionIndexes, tableToTransform, (tableState, currentIndex) =>
                    Table.InsertRows(tableState, currentIndex, blankRowToInsert)
                ) 
        in
            insertBlankRows,
invokeFunction = fxInsertBlankRows(#"Renamed Columns")
in
    invokeFunction
...