Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 对列表中的多个表执行操作_Excel_Powerquery - Fatal编程技术网

Excel 对列表中的多个表执行操作

Excel 对列表中的多个表执行操作,excel,powerquery,Excel,Powerquery,试图教会自己权力查询,却无法理解这个特殊的过程 我知道可能还有其他可能更有效的方法来实现所需的结果,但我在这里的目的是了解对表列表中的每个表执行多个操作的过程,其中列表中的条目数未知和/或较大 我的原始数据在相邻列中有成对的信息[Credit,Name],成对数量未知 由于它是一个表,不同的列/对具有不同的名称 Credit | Name | Credit1 | Name1 |…… 如果我降级标题并转置表,列标题将在第1列结束,我可以去掉区分数字 使用Table.Split,我可以创建许多

试图教会自己权力查询,却无法理解这个特殊的过程

我知道可能还有其他可能更有效的方法来实现所需的结果,但我在这里的目的是了解对表列表中的每个表执行多个操作的过程,其中列表中的条目数未知和/或较大

  • 我的原始数据在相邻列中有成对的信息
    [Credit,Name]
    ,成对数量未知

    • 由于它是一个表,不同的列/对具有不同的名称

      Credit | Name | Credit1 | Name1 |……

  • 如果我降级标题并转置表,列标题将在第1列结束,我可以去掉区分数字

  • 使用
    Table.Split
    ,我可以创建许多表,其中每对列都有相同的标题
  • 然后,我可以组合这些表来创建一个单列、两列的表,在其中我可以分组和聚合以获得结果
我的问题是,我无法想出如何执行以下操作:

Table.PromoteHeaders(Table.Transpose(table))
每个表上的操作

此M代码为提供的数据中的四对列生成所需的结果,但显然不可伸缩,因为需要提前知道表的数量

let 
   //Create the table
   Tbl1= Table.FromRecords({
      [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
      [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"]
      }),

   //Demote headers and transpose
   transpose1 = Table.Transpose( Table.DemoteHeaders(Tbl1)),

   //Create matching names for what will eventually be the final Column Headers
    #"Split Column by Character Transition" = Table.SplitColumn(transpose1, "Column1", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"Column1.1", "Column1.2"}),
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Character Transition",{"Column1.2"}),

   //Create multiple tables from above
    multTables = Table.Split(#"Removed Columns",2),

   /*transpose and promote the headers for each table
   HOW can I do this in a single step when I don't know how many tables there might be???
   */

   tbl0 = Table.PromoteHeaders(Table.Transpose(multTables{0}),[PromoteAllScalars=true]),
   tbl1 = Table.PromoteHeaders(Table.Transpose(multTables{1}),[PromoteAllScalars=true]),
   tbl2  = Table.PromoteHeaders(Table.Transpose(multTables{2}),[PromoteAllScalars=true]),
   tbl3 = Table.PromoteHeaders(Table.Transpose(multTables{3}),[PromoteAllScalars=true]),

   combTable = Table.Combine({tbl0,tbl1,tbl2,tbl3})


in
    combTable
原始表格

降级标题/转置表格

期望的结果


任何帮助都将不胜感激。

有点笨重,但似乎可以处理任意数量的行和任意数量的2列对列

首先,以不同的方式修改一组索引,然后将过滤器分为两个表,unpivot和merge

let  Tbl1= Table.FromRecords({
  [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
  [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"],
  [Credit = 3, Name = "Sam", Credit2 = 5, Name2="Allen", Credit3 = 3.5, Name3 = "Ralph",Credit4 = 7, Name4="Nance"]
  }),

#"Transposed Table" = Table.Transpose(Tbl1),
#"Added Index" = Table.AddIndexColumn(#"Transposed Table", "Index", 0, .5),
#"Added Custom" = Table.AddColumn(#"Added Index", "Index2", each Number.RoundDown([Index])),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index"}),
#"Added Index1" = Table.AddIndexColumn(#"Removed Columns", "Index", 0, 1),
#"Added Custom1" = Table.AddColumn(#"Added Index1", "Custom", each Number.Mod([Index],2)),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom1",{"Index"}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Columns1", {"Index2", "Custom"}, "Attribute", "Value"),
#"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([Custom] = 0)),
#"Filtered Rows2" = Table.SelectRows(#"Unpivoted Other Columns", each ([Custom] = 1)),
#"Merged Queries" = Table.NestedJoin(#"Filtered Rows2",{"Index2", "Attribute"},#"Filtered Rows",{"Index2", "Attribute"},"Filtered Rows",JoinKind.LeftOuter),
#"Expanded Filtered Rows" = Table.ExpandTableColumn(#"Merged Queries", "Filtered Rows", {"Value"}, {"Value.1"}),
#"Removed Columns2" = Table.RemoveColumns(#"Expanded Filtered Rows",{"Index2", "Custom", "Attribute"})
in #"Removed Columns2"
另一种方法是创建两个表,方法是根据列名称选择和取消激发列组,然后使用引用每个表中的行索引的自定义列组合它们

  let  Tbl1= Table.FromRecords({
  [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
  [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"],
  [Credit = 3, Name = "Sam", Credit2 = 5, Name2="Allen", Credit3 = 3.5, Name3 = "Ralph",Credit4 = 7, Name4="Nance"]
  }),
  Credit = List.Select(Table.ColumnNames(Tbl1), each Text.Contains(_, "Credit")),
  Name = List.Select(Table.ColumnNames(Tbl1), each Text.Contains(_, "Name")),

  // create table of just Names with index
  #"Removed Columns1" = Table.RemoveColumns(Tbl1,Credit),
  #"Added Index" = Table.AddIndexColumn(#"Removed Columns1", "Index", 0, 1),
  #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),

  // create table of just Credits with index
  #"Removed Columns2" = Table.RemoveColumns(Tbl1,Name),
  #"Added Index2" = Table.AddIndexColumn(#"Removed Columns2", "Index", 0, 1),
  #"Unpivoted Other Columns2" = Table.UnpivotOtherColumns(#"Added Index2", {"Index"}, "Attribute", "Value"),
  #"Added Index1" = Table.AddIndexColumn(#"Unpivoted Other Columns2", "Index.1", 0, 1),

  //merge two table together and remove excess columns
  #"Added Custom" = Table.AddColumn(#"Added Index1", "Custom", each #"Unpivoted Other Columns"{[Index.1]}[Value]),
  #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Attribute", "Index.1"})
  in #"Removed Columns"

您也可以尝试替换这部分代码:

   tbl0 = Table.PromoteHeaders(Table.Transpose(multTables{0}),[PromoteAllScalars=true]),
   tbl1 = Table.PromoteHeaders(Table.Transpose(multTables{1}),[PromoteAllScalars=true]),
   tbl2  = Table.PromoteHeaders(Table.Transpose(multTables{2}),[PromoteAllScalars=true]),
   tbl3 = Table.PromoteHeaders(Table.Transpose(multTables{3}),[PromoteAllScalars=true]),

   combTable = Table.Combine({tbl0,tbl1,tbl2,tbl3})


in
   combTable
为此:

    Custom1 = List.Transform(multTables, each Table.PromoteHeaders( Table.Transpose(_),[PromoteAllScalars=true])),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandTableColumn(#"Converted to Table", "Column1", {"Credit", "Name"}, {"Credit", "Name"})
in
    #"Expanded Column1"

谢谢你的回复。它确实可以从输入中获得所需的结果。但是我想要的是在一行代码中对多个表执行相同操作的方法/语法(因为PQ实际上没有循环)。这正是我想要的。谢谢