首页 > 解决方案 > 根据列的值将一个表拆分为多个较小的表-Power Query

问题描述

我有一个这样的表,我在电源查询中使用“组合和编辑”选项获得了来自多个.xlsx文件的多个工作表的信息。工作表名称永远不会改变,它们会保持不变,excel 文件可以改变。

在此处输入图像描述

column1现在,我想要许多表按's value拆分firstkey。所以,我可以得到多个这样的表,

在此处输入图像描述

我一直在谷歌搜索以找到答案,仍然没有成功。有这样的线程需要您复制原始表并过滤每个值。

.xlsx但是,就我而言,如果我有新文件,我想以某种方式自动化。因此,如果我得到一个值Brooklyn Park而不是Bursville,则应根据Column1' 值对其进行过滤。

如何执行此 Power Query?

编辑

根据要求,一个文件的原始 excel 表,

在此处输入图像描述

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"

我使用这段代码创建了一个函数来为每个文件自动化。

标签: excelpowerquerym

解决方案


您发布的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

推荐阅读