PowerQuery可以輕松批量處理文件夾下的多個(gè)文件。
【不推薦】直接利用UI完成文件合并處理
最直觀的方法是直接在UI界面就合并所有文件:

這樣處理的好處是簡便快捷,然而壞處卻也不少:
首先是強(qiáng)迫癥患者無法接受Powerquery自動(dòng)生成的查詢和函數(shù):

其次是自動(dòng)合并的結(jié)果可能會(huì)出現(xiàn)四個(gè)問題:

1.是可能出現(xiàn)莫名其妙的錯(cuò)誤而導(dǎo)致截圖中2所示的文件變少了;
2.文件變少了(示例中其實(shí)有7個(gè)區(qū),但到B1區(qū)就因?yàn)殄e(cuò)誤截止了),原因在于該文件夾下第二個(gè)文件結(jié)構(gòu)和其他文件不太一樣。不過這個(gè)問題通過刪除結(jié)構(gòu)不一樣的文件后可以解決;
3.最重要的問題是如果表格結(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)。不過,也可以對(duì)第一個(gè)文件的表格和其他文件的表格進(jìn)行特殊處理,從而忽略掉其他表格標(biāo)題行,但這又會(huì)增加處理的步驟。
第三,如果文件很多,數(shù)據(jù)量超級(jí)大,會(huì)帶來性能問題:因?yàn)槊恳淮尾僮鞫际菍?duì)該文件夾下所有文件的數(shù)據(jù)進(jìn)行處理。
如果沒有強(qiáng)迫癥情結(jié),每個(gè)數(shù)據(jù)文件結(jié)構(gòu)也很規(guī)整,數(shù)據(jù)量也不大,需要調(diào)試的代碼少,可以直接用UI來處理。
【推薦】將單個(gè)文件的步驟轉(zhuǎn)化成函數(shù),再應(yīng)用到其他文件
所以現(xiàn)在我采用另外一種方法來規(guī)避直接在UI操作產(chǎ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ì)彈出提示說沒有參數(shù),是否要?jiǎng)?chuàng)建。不管它,點(diǎn)“創(chuàng)建”。將函數(shù)命名(我用的是fnBatch)。下一步我們手動(dòng)修改函數(shù)的參數(shù)。

這時(shí),我們就把步驟1的查詢變成了一個(gè)沒有參數(shù)的函數(shù)。這個(gè)函數(shù)還沒法用,我們必須為其指定參數(shù)。
4.為fnBatch()函數(shù)手動(dòng)指定參數(shù)。這里我們要思考下,步驟1產(chǎn)生的查詢,有很多步驟,那我們究竟要在哪一步設(shè)置參數(shù),使其能根據(jù)不同的參數(shù)值而獲得不同的結(jié)果呢?這個(gè)判定相當(dāng)重要。這時(shí)我們要回到我們最初的目標(biāo)上來——我們要把單個(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è)查詢。換句話說,有1000個(gè)文件,要調(diào)用1000次,生成1000個(gè)查詢。顯然這并不是我們想要的。我們想要的是批量調(diào)用。
批量調(diào)用的第一步是把該文件夾下所有文件都引入到PowerQuery中來,那自然是要用到本文開始時(shí)所用的Folder.Files()。
新建一個(gè)文件夾源,將所有文件引入PowerQuery,刪除其他無關(guān)列,只保留FolderPath列和Name兩列。目的是獲取到每一個(gè)文件的全路徑。下一步我們將通過合并兩列的方式獲取全路徑。

由于參數(shù)是文件夾全路徑,而文件夾全路徑可以通過將FolderPath列和Name用“&”連接獲取到,因此,這時(shí)我們可以通過新增一列來直接調(diào)用fnBatch()函數(shù):
= Table.AddColumn(篩選的行, "自定義", each fnBatch([Folder Path]&[Name]))
調(diào)用后,在新增的列中每一行都是一個(gè)Table,里邊就是左側(cè)文件的處理結(jié)果。

最后,點(diǎn)擊列名“自定義”旁邊的展開符號(hào),自動(dòng)將所有文件的處理結(jié)果合并到一個(gè)表格中,處理完畢。
【總結(jié)】后一種方法看似步驟比較繁多,但是因?yàn)樗鼙苊庖幌盗凶詣?dòng)操作帶來的問題,所以值得為之付出。并且如果操作熟練后,一些步驟可以合并或省略。