PowerQuery中列名動態(tài)化方法

先來個(gè)題外話:我個(gè)人感覺天朝無論是政府還是普通民眾還是企業(yè),規(guī)范意識都相當(dāng)糟糕。

這個(gè)題外話和這篇帖子的主題有什么關(guān)系呢?那就是,明明有統(tǒng)一的數(shù)據(jù)模板,但就是不愿意提供給客戶去填寫;客戶方呢,明明提供了模板給ta,ta就是喜歡把你的模板丟一邊,發(fā)一些讓你看了頭大的數(shù)據(jù)過來。

我現(xiàn)在面臨的一個(gè)場景是:我需要把客戶提供過來的數(shù)據(jù),整理成我們系統(tǒng)可識別的,然后導(dǎo)入系統(tǒng)。但是客戶提供過來的數(shù)據(jù)呢,同一個(gè)字段可能叫“手機(jī)”,也可能叫“手機(jī)號碼”,也可能叫“聯(lián)系電話”,也可能叫“電話”,還可能叫聯(lián)系方式“,搞不好還冒點(diǎn)英文叫“mobile”??蛻籼峁┑耐瑯訑?shù)據(jù),簡直達(dá)到了隨心所欲從不守規(guī)矩的地步。這就導(dǎo)致我建立的Powerquery模板隨時(shí)陣亡。

作為懶人,我當(dāng)然不愿意每次手工去修改列名。所以,有三個(gè)辦法供我選擇:

一是用if來判斷列名中是否包含特定字段

如果包含我需要的字段,那么執(zhí)行代碼塊A;如果不包含我需要的字段,那么執(zhí)行代碼塊B。比如下面這行代碼:

 =if List.ContainsAny(Table.ColumnNames(buffer),{"性別","sex","Sex","SEX"})  then Table.RenameColumns(設(shè)置email等,{List.First(List.Range(Table.ColumnNames(設(shè)置email等),List.PositionOfAny(Table.ColumnNames(設(shè)置email等),{"性別","sex","Sex","SEX"}),1)),"性別"}) else 設(shè)置email等

我用 List.ContainsAny()來檢查列名中是否包含是否包含{"性別","sex","Sex","SEX"}中的任意一個(gè),如果包含,那么我就將其重命名為“性別”。這樣做的依據(jù)是雖然客戶會對字段亂命名,但是每一個(gè)字段亂命名的范圍是有限的,而且我假定了每個(gè)字段都是唯一的,不會有重名或一個(gè)字段被叫幾個(gè)名字的情況存在。

二是在展開列時(shí),用類似于Table.ColumnNames()的函數(shù)來獲取列名

在處理過程中,經(jīng)常會遇到展開列的情況。如果直接在UI點(diǎn)擊展開列的按鈕,那么生成的代碼,列名是硬編碼的,這時(shí),如果客戶提供的數(shù)據(jù)中有任何一個(gè)字段名字和模板中的名字不一樣,就會導(dǎo)致模板出錯(cuò)。所以,需要把展開列的代碼塊中列名進(jìn)行軟編碼。

這主要用的是獲取列名或記錄的字段名稱的函數(shù)。如下面兩段代碼所示,分別展開了由記錄構(gòu)成的表格的列和由列構(gòu)成的表格的列。

表格中嵌套Record
= Table.ExpandRecordColumn(刪除的其他列, "自定義", Record.FieldNames(刪除的其他列[自定義]{0}),Record.FieldNames(刪除的其他列[自定義]{0}))

或者

嵌套表格
= Table.ExpandTableColumn(刪除的其他列1, "自定義", Table.ColumnNames(刪除的其他列1[自定義]{0}),Table.ColumnNames(刪除的其他列1[自定義]{0}))

三是結(jié)合Table.SelectColumns()和,Table.ColumnNames()選擇我需要的列

客戶提供的數(shù)據(jù)字段中有很多是我們不需要的,我只想保留我需要的字段。比如下面這個(gè)例子,對客戶數(shù)據(jù)處理后的表格中,包含系統(tǒng)模板所需的字段,還包括多余的字段,我從其他地方獲取到模板的列名,然后只選擇表格中包含這些列名的列,就排除了那些我不需要的列,無論這些列的名字是什么。

= Table.SelectColumns(設(shè)置根節(jié)點(diǎn)編碼,Table.ColumnNames(Table.PromoteHeaders(源之系統(tǒng)導(dǎo)入模板{[Item="用戶導(dǎo)入模板",Kind="Sheet"]}[Data])))

反思:如果只處理一次,客戶數(shù)據(jù)文檔只有一個(gè),還不如手動重命名原始文件來得快和方便。當(dāng)客戶數(shù)據(jù)有無數(shù)個(gè),或者需要無數(shù)次處理的時(shí)候,這種動態(tài)化將減少一些重復(fù)勞動。

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

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

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