Power Query / M代码,将一系列表提取到一个主表中,一些列标题相同,但有些不同并且顺序不同(并且在第2行)

问题描述 投票:0回答:1

我的 Excel 文件中有一些命名范围,需要合并。列名称各不相同,但大多数都有日期和代码。我不能将它们作为 Excel 中的表格,它们需要保留为命名范围,因为我不想冒用 Excel 公式填充列的风险。问题是需要提取标题,因为从技术上讲它是第二行。

无论如何,我已经扩展了表格,但我无法对齐不同表格中的列。下面是我必须解释的地方(逗号是分隔符)

步骤:#“记录器列”:

name, content
Events1, table
Events2, table

Events1 表包含以下数据:

Column1, Column2, Column3, Column4
DATE, FIRST NAME, SURNAME, CODE
1/2/24, John, Smith, 3

Events2 表包含以下数据:

Column1, Column2, Column3
DATE, FULL NAME, CODE
1/3/24, Peter Smith, 2

我想合并两个表。我需要忽略第一行,因为标题是第二行。最终结果需要如下所示。

姓名、日期、名字、姓氏、全名、代码 事件 1、24 年 1 月 2 日、约翰、史密斯、空、空、3 活动 2,24 年 1 月 3 日,空,空,彼得·史密斯,2

实际上还有更多的表,所有标题都保证第 2 行,并且它们将具有日期、代码,但所有其他字段可能会有所不同,顺序也可能不同

这是迄今为止扩展表中所有数据的代码,但我未能弄清楚如何获取标题,然后合并/对齐它们。

let
    Source = Excel.CurrentWorkbook(),
    #"Merged Queries" = Table.NestedJoin(Source, {"Name"}, Events_List, {"NamedRanges"}, "Events_List", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries", {"Events_List"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns", {"Name", "Content"}),

    // Expand the "Content" column to reveal the tables
    ExpandContent = Table.ExpandTableColumn(#"Reordered Columns", "Content", Table.ColumnNames(#"Reordered Columns"[Content]{0}))
in
    ExpandContent

这提供了:

Name, Column1, Column2, Column3, Column4
Events1, DATE, FIRST NAME, SURNAME, Code
Events1, 1/2/24, John, Smith, 3
Events2, DATE, FULL NAME, CODE
Events2, 1/3/24, Peter Smith, 2

如上所述,我需要去

Name, DATE, FIRST NAME, SURNAME, FULL NAME, CODE
Events1, 1/2/24, John, Smith, null, null, 3
Events2, 1/3/24, null, null, Peter Smith, 2

感谢您的指导。

excel append powerquery named-ranges
1个回答
0
投票

通过使用高级编辑器将以下代码插入空白查询来创建自定义函数。

将此函数命名为

fnProcess Tables

(t as table)=>

let 
    Source = Table.PromoteHeaders(Table.RemoveFirstN(t,1), [PromoteAllScalars=true])
in  
    Source

对于您的主要查询,请将下面的代码粘贴到另一个空白查询中

let
    #"Range List" = {"Events1","Events2"},
    #"Column Order" = {"DATE","FIRST NAME","SURNAME","FULL NAME","CODE"},
    #"Column Types" = { {"DATE", type nullable date},
                        {"FIRST NAME", type nullable text},
                        {"SURNAME", type nullable text},
                        {"FULL NAME",type nullable text},
                        {"CODE", Int64.Type}},

    Source = Excel.CurrentWorkbook(),
    Tables = Table.SelectRows(Source, each List.Contains(#"Range List", [Name]))[Content],
    #"Process Tables" = List.Accumulate(
        {1..List.Count(Tables)-1},
        {#"fnProcess Tables"(Tables{0})},
        (s,c)=>s &  {#"fnProcess Tables"(Tables{c})}),
    #"Append" = Table.Combine(#"Process Tables"),
    #"Reorder" = Table.ReorderColumns(#"Append", #"Column Order"),
    #"Type" = Table.TransformColumnTypes(#"Reorder", #"Column Types")
        
in
    #"Type"

您可能需要进行一些更改以适合您的实际数据集。

Events1 和 Events2 命名范围

结果

© www.soinside.com 2019 - 2024. All rights reserved.