隔列获取纵向合并

题目:

在工作中我们经常会遇到很多不规范的表格,比如这样:

一个sheet里塞了很多张格式一模一样的表,但是横向排列的,非常不便于做分析,所以需要把这些表格进行合并。如果这种独立表格的数量不多我们可以手动框选区域分别插入表格,然后用PQ追加查询,但是如果表格有很多显然不现实。
 

解法:

每一张独立表格的列数都是相同的,所以如果我们能够从左往右,每次跳过8列,然后获取8列数据,再进行合并就可以了。如果是隔行获取可以用Table.AlternateRows,现在要获取列可是没有AlternateColumns啊,所以需要将table先转成list,然后用List.Transform+List.Range的套路,分别获取到我们想要的列,然后还原成table,最后合并即可。

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    整理 = Table.Combine(List.Transform({0..2},each Table.FromColumns(List.Range(List.Select(Table.ToColumns(源),each _{0}<>null),8*_,8),List.FirstN(Table.ColumnNames(源),8))))
in
    整理

其中List.Range的第二参数可能很多人不太理解,_代表前面List.Transform里的每一个元素,也就是0,1,2,那为什么是8*_?因为我们一张独立表格里有8列,我们要取的起始索引分别为0,8,16,公差是8所以要乘以8。理解了这个案例,对于类似的隔列获取的题差不多就都能解决了。

附件

2 Replies to “隔列获取纵向合并”

  1. =
    Table.Combine(
    List.Transform(
    {0..2},
    each
    Table.FromColumns(
    List.Range(
    List.Select(
    Table.ToColumns(源),
    each _{0}null
    ),
    8*_,
    8
    ),
    List.FirstN(Table.ColumnNames(源),8)
    )
    )
    )

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注