PowerQuery中两种批量处理文件夹下多个文件的方法

PowerQuery可以轻松批量处理文件夹下的多个文件。

【不推荐】直接利用UI完成文件合并处理

最直观的方法是直接在UI界面就合并所有文件:


直接合并所有文件

这样处理的好处是简便快捷,然而坏处却也不少:

首先是强迫症患者无法接受Powerquery自动生成的查询和函数:


自动生成的查询和函数组

其次是自动合并的结果可能会出现四个问题:


自动生成的查询的问题

1.是可能出现莫名其妙的错误而导致截图中2所示的文件变少了;
2.文件变少了(示例中其实有7个区,但到B1区就因为错误截止了),原因在于该文件夹下第二个文件结构和其他文件不太一样。不过这个问题通过删除结构不一样的文件后可以解决;
3.最重要的问题是如果表格结构混乱,要把结构调整好,在这种情况下即使是不可能的也是极其困难的。
4.即使把表格结构调整好了,一不注意还会产生另一个疏漏——把表格结构调整好之,将第一行提升为表格标题后,忘记把其他表格的标题行删除从而导致错误出现。不过,也可以对第一个文件的表格和其他文件的表格进行特殊处理,从而忽略掉其他表格标题行,但这又会增加处理的步骤。

第三,如果文件很多,数据量超级大,会带来性能问题:因为每一次操作都是对该文件夹下所有文件的数据进行处理。

如果没有强迫症情结,每个数据文件结构也很规整,数据量也不大,需要调试的代码少,可以直接用UI来处理。

【推荐】将单个文件的步骤转化成函数,再应用到其他文件

所以现在我采用另外一种方法来规避直接在UI操作产生的问题。
1.首先按常规处理单个文件的方法,对一个文件进行处理,对数据进行清洗和规范化操作。
2.如何把处理步骤批量应用到其他文件上呢?思路就是把上一步的处理步骤变成一个函数。
3.在步骤1所产生的查询上右键单击,选择“创建函数”:


创建函数

这时会弹出提示说没有参数,是否要创建。不管它,点“创建”。将函数命名(我用的是fnBatch)。下一步我们手动修改函数的参数。


未找到参数的警告

这时,我们就把步骤1的查询变成了一个没有参数的函数。这个函数还没法用,我们必须为其指定参数。
4.为fnBatch()函数手动指定参数。这里我们要思考下,步骤1产生的查询,有很多步骤,那我们究竟要在哪一步设置参数,使其能根据不同的参数值而获得不同的结果呢?这个判定相当重要。这时我们要回到我们最初的目标上来——我们要把单个文件的处理规则批量应用到其他文件上。那么在PowerQuery中,如何才能引入其他文件呢?那就是文件路径。所以我们要把fnBatch()中的文件路径参数化。在左侧查询列表选中fnBatch(),点击菜单栏中的“高级编辑器”,这时会弹出警告,不用理它,点“确定”。
编辑函数的警告

我用的参数名是“file”。可以使用任意符合要求的参数名。
设置参数.png

设置好参数后是下面这个样子:


参数设置完毕

设置好参数后,关闭“高级编辑器”。这时fnBatch()就可以调用了:
可调用的函数

5.调用函数。最直观的调用方法是把其他几个文件的全路径复制粘贴到fnBatch()的参数调用框里,这样将为每个文件生成一个查询。换句话说,有1000个文件,要调用1000次,生成1000个查询。显然这并不是我们想要的。我们想要的是批量调用。
批量调用的第一步是把该文件夹下所有文件都引入到PowerQuery中来,那自然是要用到本文开始时所用的Folder.Files()。
新建一个文件夹源,将所有文件引入PowerQuery,删除其他无关列,只保留FolderPath列和Name两列。目的是获取到每一个文件的全路径。下一步我们将通过合并两列的方式获取全路径。


保留Name和FolderPath两列

由于参数是文件夹全路径,而文件夹全路径可以通过将FolderPath列和Name用“&”连接获取到,因此,这时我们可以通过新增一列来直接调用fnBatch()函数:

  = Table.AddColumn(筛选的行, "自定义", each fnBatch([Folder Path]&[Name]))

调用后,在新增的列中每一行都是一个Table,里边就是左侧文件的处理结果。


调用fnbatch函数的结果

最后,点击列名“自定义”旁边的展开符号,自动将所有文件的处理结果合并到一个表格中,处理完毕。

【总结】后一种方法看似步骤比较繁多,但是因为它能避免一系列自动操作带来的问题,所以值得为之付出。并且如果操作熟练后,一些步骤可以合并或省略。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,784评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,638评论 18 139
  • 我总是那么凑巧地 出现在你来的时候 我总是那么凑巧地 你来的时候我正好也在 我相信灵魂是存在的 不然怎么会有琴弦一...
    天堂里的鱼阅读 237评论 1 5
  • 我又梦到了母亲 那个安详的在村口和人拉话的母亲 她说的最多的是她的孩子 是她的分散四处的孩子 门口的大梨树 日日陪...
    东方地秀阅读 528评论 5 11
  • 记忆中,我最早接触的书,是图书连环画,就是上面是图画,下面配有文字的小人书。在七八十年代,儿童图书并不像现在那样泛...
    一泓夜雨阅读 454评论 8 4