PowerQuery中兩種批量處理文件夾下多個(gè)文件的方法

PowerQuery可以輕松批量處理文件夾下的多個(gè)文件。

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

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


直接合并所有文件

這樣處理的好處是簡便快捷,然而壞處卻也不少:

首先是強(qiáng)迫癥患者無法接受Powerquery自動(dòng)生成的查詢和函數(shù):


自動(dòng)生成的查詢和函數(shù)組

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


自動(dòng)生成的查詢的問題

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ù)”:


創(chuàng)建函數(shù)

這時(shí)會(huì)彈出提示說沒有參數(shù),是否要?jiǎng)?chuàng)建。不管它,點(diǎn)“創(chuàng)建”。將函數(shù)命名(我用的是fnBatch)。下一步我們手動(dòng)修改函數(shù)的參數(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ù)的警告

我用的參數(shù)名是“file”??梢允褂萌我夥弦蟮膮?shù)名。
設(shè)置參數(shù).png

設(shè)置好參數(shù)后是下面這個(gè)樣子:


參數(shù)設(shè)置完畢

設(shè)置好參數(shù)后,關(guān)閉“高級(jí)編輯器”。這時(shí)fnBatch()就可以調(diào)用了:
可調(diào)用的函數(shù)

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è)文件的全路徑。下一步我們將通過合并兩列的方式獲取全路徑。


保留Name和FolderPath兩列

由于參數(shù)是文件夾全路徑,而文件夾全路徑可以通過將FolderPath列和Name用“&”連接獲取到,因此,這時(shí)我們可以通過新增一列來直接調(diào)用fnBatch()函數(shù):

  = Table.AddColumn(篩選的行, "自定義", each fnBatch([Folder Path]&[Name]))

調(diào)用后,在新增的列中每一行都是一個(gè)Table,里邊就是左側(cè)文件的處理結(jié)果。


調(diào)用fnbatch函數(shù)的結(jié)果

最后,點(diǎn)擊列名“自定義”旁邊的展開符號(hào),自動(dòng)將所有文件的處理結(jié)果合并到一個(gè)表格中,處理完畢。

【總結(jié)】后一種方法看似步驟比較繁多,但是因?yàn)樗鼙苊庖幌盗凶詣?dòng)操作帶來的問題,所以值得為之付出。并且如果操作熟練后,一些步驟可以合并或省略。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 8,107評(píng)論 0 27
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 我總是那么湊巧地 出現(xiàn)在你來的時(shí)候 我總是那么湊巧地 你來的時(shí)候我正好也在 我相信靈魂是存在的 不然怎么會(huì)有琴弦一...
    天堂里的魚閱讀 268評(píng)論 1 5
  • 我又夢到了母親 那個(gè)安詳?shù)脑诖蹇诤腿死挼哪赣H 她說的最多的是她的孩子 是她的分散四處的孩子 門口的大梨樹 日日陪...
    東方地秀閱讀 584評(píng)論 5 11
  • 記憶中,我最早接觸的書,是圖書連環(huán)畫,就是上面是圖畫,下面配有文字的小人書。在七八十年代,兒童圖書并不像現(xiàn)在那樣泛...
    一泓夜雨閱讀 513評(píng)論 8 4

友情鏈接更多精彩內(nèi)容