1背景介绍
在进行数据处理时,一般获取的数据有两种:
1)单个文件,很多情况下是结构不同的单个问题,需要逐个加载处理;
2)多个结构相同的单个文件,需要对多个文件进行合并处理;
针对两张形式,pq都能通过可视化方式处理,尤其的多个结构相同的单个文件,可以通过加载文件夹的方式进行自动合并,会自动生成查询和函数组进行合并。而在现实进行数据处理中又有两个痛点问题:
1)pq模型做好以后,同步给同事需要修改加载路径,如果加载的数据来源较多,会非常麻烦。
2)文件夹方式加载数据会自动生成函数和查询,而且是每加载一个文件夹就会出现一次,显得很乱;
本文将重点解决以上两个问题。
2不同终端数据源加载的便捷方式
说道便捷,我们第一个想到的肯定是把数据拷贝过来,就能自动识别,这是最最最便捷的方式,什么都不用做就OK了,充分体现出自动化智能化。这里能想到的这种自动化有两种方式:
1)真正的自动,不管数据源放哪里,都能自动找到,几乎不可能,虽然能用搜索的方式实现部分,但是如果出现有相同文件名的文件时就傻眼了;
2)利用相对路径实现,所谓相对路径就是相对你操作的文件的路径,一般是将数据源和模型文件放在一个文件夹,通过相对路径来获取数据源,唯一需要注意的是需要在同一个文件下,如果分开就不自动了。很可惜,pq不支持相对路径,具体原因未知。
既然自动无法实现,而手动又会很麻烦,所以使用半自动方式实现。
思路:通过一个表格来配置文件的路径,将表格加载到pq,在需要该数据时调用。
这里的调用也有两种方式:
1)创建函数调用,传入一个需要的参数,通过函数来获取需要的数据路径;
2)直接引用;
在这里就介绍更简单的直接引用方式。
第一步,新建文件位置的表格,两个字段“表名”和“路径”,需要注意表名不一定是真实的表名,可以自定义;
第二步,将表加载到pq,然后直接在需要的地方引用;
先看下引用:从深化看引用
可以看到直接引用表中数据的方式是“数据表名{行数}[列名]”,通过这种方式我们可以想到,如果我们的表是固定的,就能通过该方式获取路径,比如我需要获取第三行第二列中的路径,那么可以直接用“= 更改的类型{2}[总路径]”来获取。
进一步,如果我们的行排序是混乱的,或者有可能会混乱,用该方式就很容易出错,那么该用什么来定位行号呢?这里定义的“表名”列就可以作为依据,所以需要表名是唯一的。 如何通过表名来获取呢?来看看通过可视化方式加载文件的脚本。
可以看到根据唯一标识获取的方式是“数据表名{[列名=”标识”]}[列名]”,根据这种方式,我们想获取文件位置中第三行第二列中的路径可以用“= 更改的类型{[表名="语音导航系统指标日报表2"]}[总路径]”。
再来看看如何在需要的地方引用:
上面在加载单个文件的脚本中可以看到是直接加载的路径,那么这里只用将该路径直接替换成引用的路径。
到这里就实现了办自动的数据加载啦,发给同事后只用更改下文件路径,刷新下数据,就能实现数据的自动加载刷新。
延伸:
1)看下方截图,很明显“Name”字段的名称明显会有变化,该如何破?
2)如果要加载一个文件中的多个sheet该如何配置?
3相同结构文件的最优合并方式
第一步,按照单个文件的处理方式,加载并处理一个文件,生成所需要的脚本;
第二步,将处理单个文件的脚本创建成函数,函数名随意;
这里需要注意,如果有多个文件夹数据,每个下面的数据结构不同,但是对于加载后的处理方式有相似之处时,则创建的函数尽可能的能适配所有的文件,这样能省去创建多个函数麻烦,如果都是独立的,则每个文件夹下的数据表都需要创建相应的函数。
第三步,修改函数中的参数,这里有一个定位参数的过程,根据不同的目的来定位,这里的目的是希望其他文件也能像单个文件一样处理,那么这里就需要传入其他文件,所以这里的参数是文件路径,只要传入路径就能进行处理。
这里需要注意我修改了3个地方,前两个是传入的文件路径的参数,第三个是使用了引用的方式,也是第二部分介绍中的延伸1的一种解决方式。
第四步,调用函数。
函数已经创建成功,我们传入文件路径就可以调用生成相应的查询了。思考一下,如果我有10个相同的表,我把表的路径一个一个传入,就会生成10个查询,然后将10个查询追加合并,就能得到想要的合并数据。显然这种方式还是一个一个手动操作,而我们希望的是批量调用。如何批量?
先将所有的表放到一个文件夹下,然后以加载文件夹数据的方式加载到pq中;
加载进入后,可以发现我们需要传入函数的file参数值是FolderPath列和Name两列的合并值,那么接下来就简单了,直接添加一列,调用函数,参数用FolderPath&Name
然后再删除其他列,展开表格数据即可得到合并的数据。
延伸:
在第四步中,加载文件夹到pq,可以看到加载后也是文件夹路径,这里就可以使用第二部分介绍的表格配置路径,然后在此处引用的方式实现半自动化加载啦。