PowerQuery中列名动态化方法

先来个题外话:我个人感觉天朝无论是政府还是普通民众还是企业,规范意识都相当糟糕。

这个题外话和这篇帖子的主题有什么关系呢?那就是,明明有统一的数据模板,但就是不愿意提供给客户去填写;客户方呢,明明提供了模板给ta,ta就是喜欢把你的模板丢一边,发一些让你看了头大的数据过来。

我现在面临的一个场景是:我需要把客户提供过来的数据,整理成我们系统可识别的,然后导入系统。但是客户提供过来的数据呢,同一个字段可能叫“手机”,也可能叫“手机号码”,也可能叫“联系电话”,也可能叫“电话”,还可能叫联系方式“,搞不好还冒点英文叫“mobile”。客户提供的同样数据,简直达到了随心所欲从不守规矩的地步。这就导致我建立的Powerquery模板随时阵亡。

作为懒人,我当然不愿意每次手工去修改列名。所以,有三个办法供我选择:

一是用if来判断列名中是否包含特定字段

如果包含我需要的字段,那么执行代码块A;如果不包含我需要的字段,那么执行代码块B。比如下面这行代码:

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

我用 List.ContainsAny()来检查列名中是否包含是否包含{"性别","sex","Sex","SEX"}中的任意一个,如果包含,那么我就将其重命名为“性别”。这样做的依据是虽然客户会对字段乱命名,但是每一个字段乱命名的范围是有限的,而且我假定了每个字段都是唯一的,不会有重名或一个字段被叫几个名字的情况存在。

二是在展开列时,用类似于Table.ColumnNames()的函数来获取列名

在处理过程中,经常会遇到展开列的情况。如果直接在UI点击展开列的按钮,那么生成的代码,列名是硬编码的,这时,如果客户提供的数据中有任何一个字段名字和模板中的名字不一样,就会导致模板出错。所以,需要把展开列的代码块中列名进行软编码。

这主要用的是获取列名或记录的字段名称的函数。如下面两段代码所示,分别展开了由记录构成的表格的列和由列构成的表格的列。

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

或者

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

三是结合Table.SelectColumns()和,Table.ColumnNames()选择我需要的列

客户提供的数据字段中有很多是我们不需要的,我只想保留我需要的字段。比如下面这个例子,对客户数据处理后的表格中,包含系统模板所需的字段,还包括多余的字段,我从其他地方获取到模板的列名,然后只选择表格中包含这些列名的列,就排除了那些我不需要的列,无论这些列的名字是什么。

= Table.SelectColumns(设置根节点编码,Table.ColumnNames(Table.PromoteHeaders(源之系统导入模板{[Item="用户导入模板",Kind="Sheet"]}[Data])))

反思:如果只处理一次,客户数据文档只有一个,还不如手动重命名原始文件来得快和方便。当客户数据有无数个,或者需要无数次处理的时候,这种动态化将减少一些重复劳动。

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

推荐阅读更多精彩内容