Power Query参数化设置月首日星期时Expression.Evaluate报错如何解决
Power Query 星期文本转枚举值报错解决方案
问题描述
在Power Query中需要参数化设置每月首日对应的星期值,参数来自Excel或其他源文件的星期文本,最初尝试使用Expression.Evaluate拼接"Day."+星期文本的方式获取对应枚举数值,代码如下:
let txtFirstDayOfMonth = "Monday", // 该参数来自Excel/源文件 numFirstDayOfMonth = Expression.Evaluate("Day."&txtFirstDayOfMonth) in numFirstDayOfMonth
预期输出是Day.Monday对应的数值1,实际运行抛出如下错误:
Expression.Error: [1,1-1,11] The name 'Day.Monday' doesn't exist in the current context. Details: [List]
需求是避免使用类似switch的分支语句实现该功能。
解决方案
方案1:动态解析实现(无需分支)
Expression.Evaluate默认无法识别全局枚举类的成员,只需要给函数补充第二参数#shared即可,#shared包含了当前环境下所有全局标识符的记录,可以正常识别Day枚举的相关成员,修改后的核心代码如下:
Expression.Evaluate("Day."&txtFirstDayOfMonth,#shared)
完整可运行代码:
let txtFirstDayOfMonth = "Monday", // 该参数来自Excel/源文件 numFirstDayOfMonth = Expression.Evaluate("Day."&txtFirstDayOfMonth,#shared) in numFirstDayOfMonth
运行后即可得到预期输出1。
方案2:多分支匹配实现(稳定性更高)
如果更看重代码运行稳定性,避免动态解析可能带来的异常,也可以用else if分支实现匹配,该写法支持大小写不敏感、缩写匹配,适配不规范的星期文本输入,参考代码如下:
... #"Added Conditional numFirstDayOfWeek" = Table.AddColumn (#"Added Custom", "numFirstDayOfWeek", each if Text.Contains(Text.Lower([FirstDayOfWeek]), "su") then 0 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "mo") then 1 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "tu") then 2 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "we") then 3 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "th") then 4 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "fr") then 5 else if Text.Contains(Text.Lower([FirstDayOfWeek]), "sa") then 6 else 1 )
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

