PowerQuery 相对路径解决方案

本文讲解PowerQuery动态路径

几乎所有Power BI用户都知道,在Power BI Desktop里,如何从文件或文件夹获取数据, 但这里我提出一个你们不了解但也许会遇到的一个需求,如果文件或文件夹是相对路径而非绝对路径,要怎么办呢?

一个例子,报表需要从以下路径获取指定数据(假设我们不能使用Onedrive):

C:\Users\<your account name>\Documents

且该报表需要分享给其他报表开发者进行二次开发,按照常规做法,我们会使用:

File.Contents(<文件路径>)

来连接数据源,但该路径是静态的,当我们分享给同事后,报表应该从同事的文件夹中获取数据源,如果此时还需要同事手动修改路径,就会很麻烦,特别是当这样的数据源足够多的时候。因此,有没有办法可以使路径实现动态效果呢?无论我们分享给任何人,报表都可以自动地从对方的文件夹内获取指定数据。

事实上,该需求在Power BI官方社区早已有人提及,但截至目前却没有较好的解决办法, 因此我将在下文讲解该问题的解决方法,而且是多种解决办法。

方法一: 路径参数化

以上文为例,如果不同的用户使得路径中username的部分不同,那么只需把AD域中,或者本机中的所有计算机用户名整理好,然后在新建参数时录入它们,比如命名为username, 那么就可以利用M语句新建一个自定义函数,其中路径部分为:

File.Contents("C:\Users\" & username & "\Documents")

在参数中输入任意用户名,比如Jack,然后Invoke,就可以拼凑出该用户的路径。

在这里插入图片描述
最后,我们就可以另存为PBIT分享给同事。用户只需要在打开PBIT时输入路径参数,即可加载指定数据。

方法二:使用Text.Contains

如果不想使用参数,并且不同的路径拥有相同的部分,就可以使用此方法。比如,针对于一个文件路径,它可能位于:

C:\AAA\File\Project

也可能位于:

C:\BBB\File\Project

也许你会想到完全可以使用方法一,通过使用户传参来确定路径,但此处我们C盘目录下的那个文件夹名称是不确定的,具有随机性和不规律性,或者说参数列表是手动难以维护的,此情况下,要如何做?

我们知道PowerQuery要做到像其他编程一样使用for循环遍历所有路径返回对应结果很麻烦,但我们可以使用Text.Contains函数,让该函数筛选出C盘所有包含"File\Project"路径的文件,如下:

= Table.SelectRows(Source, each Text.Contains([Folder Path], "File\Project"))

这样我们就可以获取所有相关列表,再进行下一步筛选,此时无论何人打开此报表,皆可以获取他们想要的数据。

其他

此需求的另一种场景是获取某文件夹下最新的文件的数据。假设我们有一个文件夹,里面有命名不同的csv文件,我们需要取最近一次修改的csv文件,而不清楚哪个名称的csv文件是我们需要获取的,那么此时我们不能写出一个固定不变的绝对路径来,但我们可以使用Folder.Files函数获取路径下所有文件,然后再使用Table.FirstN把Date created或Date modified字段里日期最大的过滤出来,这样就能完美解决问题。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页