PowerQuery可以輕松批量處理文件夾下的多個(gè)文件粪牲。
【不推薦】直接利用UI完成文件合并處理
最直觀的方法是直接在UI界面就合并所有文件:
這樣處理的好處是簡(jiǎn)便快捷寡壮,然而壞處卻也不少:
首先是強(qiáng)迫癥患者無(wú)法接受Powerquery自動(dòng)生成的查詢和函數(shù):
其次是自動(dòng)合并的結(jié)果可能會(huì)出現(xiàn)四個(gè)問(wèn)題:
1.是可能出現(xiàn)莫名其妙的錯(cuò)誤而導(dǎo)致截圖中2所示的文件變少了;
2.文件變少了(示例中其實(shí)有7個(gè)區(qū),但到B1區(qū)就因?yàn)殄e(cuò)誤截止了),原因在于該文件夾下第二個(gè)文件結(jié)構(gòu)和其他文件不太一樣赏半。不過(guò)這個(gè)問(wèn)題通過(guò)刪除結(jié)構(gòu)不一樣的文件后可以解決;
3.最重要的問(wèn)題是如果表格結(jié)構(gòu)混亂淆两,要把結(jié)構(gòu)調(diào)整好断箫,在這種情況下即使是不可能的也是極其困難的。
4.即使把表格結(jié)構(gòu)調(diào)整好了秋冰,一不注意還會(huì)產(chǎn)生另一個(gè)疏漏——把表格結(jié)構(gòu)調(diào)整好之仲义,將第一行提升為表格標(biāo)題后,忘記把其他表格的標(biāo)題行刪除從而導(dǎo)致錯(cuò)誤出現(xiàn)剑勾。不過(guò)埃撵,也可以對(duì)第一個(gè)文件的表格和其他文件的表格進(jìn)行特殊處理,從而忽略掉其他表格標(biāo)題行虽另,但這又會(huì)增加處理的步驟暂刘。
第三,如果文件很多捂刺,數(shù)據(jù)量超級(jí)大谣拣,會(huì)帶來(lái)性能問(wèn)題:因?yàn)槊恳淮尾僮鞫际菍?duì)該文件夾下所有文件的數(shù)據(jù)進(jìn)行處理募寨。
如果沒(méi)有強(qiáng)迫癥情結(jié),每個(gè)數(shù)據(jù)文件結(jié)構(gòu)也很規(guī)整森缠,數(shù)據(jù)量也不大拔鹰,需要調(diào)試的代碼少,可以直接用UI來(lái)處理贵涵。
【推薦】將單個(gè)文件的步驟轉(zhuǎn)化成函數(shù)列肢,再應(yīng)用到其他文件
所以現(xiàn)在我采用另外一種方法來(lái)規(guī)避直接在UI操作產(chǎn)生的問(wèn)題。
1.首先按常規(guī)處理單個(gè)文件的方法宾茂,對(duì)一個(gè)文件進(jìn)行處理瓷马,對(duì)數(shù)據(jù)進(jìn)行清洗和規(guī)范化操作。
2.如何把處理步驟批量應(yīng)用到其他文件上呢跨晴?思路就是把上一步的處理步驟變成一個(gè)函數(shù)欧聘。
3.在步驟1所產(chǎn)生的查詢上右鍵單擊,選擇“創(chuàng)建函數(shù)”:
這時(shí)會(huì)彈出提示說(shuō)沒(méi)有參數(shù)坟奥,是否要?jiǎng)?chuàng)建。不管它拇厢,點(diǎn)“創(chuàng)建”爱谁。將函數(shù)命名(我用的是fnBatch)。下一步我們手動(dòng)修改函數(shù)的參數(shù)孝偎。
這時(shí)访敌,我們就把步驟1的查詢變成了一個(gè)沒(méi)有參數(shù)的函數(shù)。這個(gè)函數(shù)還沒(méi)法用衣盾,我們必須為其指定參數(shù)寺旺。
4.為fnBatch()函數(shù)手動(dòng)指定參數(shù)。這里我們要思考下势决,步驟1產(chǎn)生的查詢阻塑,有很多步驟,那我們究竟要在哪一步設(shè)置參數(shù)果复,使其能根據(jù)不同的參數(shù)值而獲得不同的結(jié)果呢陈莽?這個(gè)判定相當(dāng)重要。這時(shí)我們要回到我們最初的目標(biāo)上來(lái)——我們要把單個(gè)文件的處理規(guī)則批量應(yīng)用到其他文件上虽抄。那么在PowerQuery中走搁,如何才能引入其他文件呢?那就是文件路徑迈窟。所以我們要把fnBatch()中的文件路徑參數(shù)化私植。在左側(cè)查詢列表選中fnBatch(),點(diǎn)擊菜單欄中的“高級(jí)編輯器”车酣,這時(shí)會(huì)彈出警告曲稼,不用理它索绪,點(diǎn)“確定”。
我用的參數(shù)名是“file”躯肌≌叽海可以使用任意符合要求的參數(shù)名。
設(shè)置好參數(shù)后是下面這個(gè)樣子:
設(shè)置好參數(shù)后清女,關(guān)閉“高級(jí)編輯器”钱烟。這時(shí)fnBatch()就可以調(diào)用了:
5.調(diào)用函數(shù)。最直觀的調(diào)用方法是把其他幾個(gè)文件的全路徑復(fù)制粘貼到fnBatch()的參數(shù)調(diào)用框里嫡丙,這樣將為每個(gè)文件生成一個(gè)查詢拴袭。換句話說(shuō),有1000個(gè)文件曙博,要調(diào)用1000次拥刻,生成1000個(gè)查詢。顯然這并不是我們想要的父泳。我們想要的是批量調(diào)用般哼。
批量調(diào)用的第一步是把該文件夾下所有文件都引入到PowerQuery中來(lái),那自然是要用到本文開(kāi)始時(shí)所用的Folder.Files()惠窄。
新建一個(gè)文件夾源蒸眠,將所有文件引入PowerQuery,刪除其他無(wú)關(guān)列杆融,只保留FolderPath列和Name兩列楞卡。目的是獲取到每一個(gè)文件的全路徑。下一步我們將通過(guò)合并兩列的方式獲取全路徑脾歇。
由于參數(shù)是文件夾全路徑蒋腮,而文件夾全路徑可以通過(guò)將FolderPath列和Name用“&”連接獲取到,因此藕各,這時(shí)我們可以通過(guò)新增一列來(lái)直接調(diào)用fnBatch()函數(shù):
= Table.AddColumn(篩選的行, "自定義", each fnBatch([Folder Path]&[Name]))
調(diào)用后池摧,在新增的列中每一行都是一個(gè)Table,里邊就是左側(cè)文件的處理結(jié)果激况。
最后险绘,點(diǎn)擊列名“自定義”旁邊的展開(kāi)符號(hào),自動(dòng)將所有文件的處理結(jié)果合并到一個(gè)表格中誉碴,處理完畢宦棺。
【總結(jié)】后一種方法看似步驟比較繁多,但是因?yàn)樗鼙苊庖幌盗凶詣?dòng)操作帶來(lái)的問(wèn)題黔帕,所以值得為之付出代咸。并且如果操作熟練后,一些步驟可以合并或省略成黄。