题目:
在工作中我们经常会遇到很多不规范的表格,比如这样:
一个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。理解了这个案例,对于类似的隔列获取的题差不多就都能解决了。
=
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)
)
)
)
要是返过来转换,函数应该咋写呢?没试出来