从信息安全到如何在DAX中实现for循环

2021-12-08 18:21:39 浏览数 (2)

在实际的业务场景中,诸多业务数据内容是不能对外展示的,比如姓名信息等:

比如在一些会议上要展示一些图表,如果仅仅是放一些数据,可能并不能起到很好的作用,如果把姓名全都放上,则又会泄露一些信息。

我们需要将姓名中间的字抹掉,保留前后的两个字:

我们可以这样写度量值:

代码语言:javascript复制
姓名2 = 
var n=[学生姓名]
var name_out=IF(LEN(n)>2,LEFT(n,1)&"*"&RIGHT(n,1),LEFT(n,1)&"*")
return name_out

此时,有人会提出疑问,四个字的中间其实两个*,这里只显示了一个:

其实有时候真的有必要让四个字的人名中间显示2个*吗,四个字的名本来就很少,“杨*意”其实很难让人猜出来是哪一个,尤其是姓名量比较大的时候。然而如果放上“杨**意”,几乎所有知道这个名字的都会100%肯定就是她!那么请问,我们对名字中间打码的意义又在何处呢?

更极端的情况,四个字“****”,男性,很多人甚至可以直接猜出来“易烊千玺”。

当然,在某些业务场景中,可能并不是如此的隐秘,的确需要将“戏子多秋”显示为“戏**秋”,甚至还有五个字的姓名“耶律阿保机”想要显示为“耶***机”,那么,应该如何写呢?

其实也比较简单,就是判断一下字数,如果是3个字中间一个星*,4个字两个星**,五个字三个***,如果所涉及到的名字多于5个字的,那就继续往下写:

代码语言:javascript复制
姓名3 = 
var n=[学生姓名]
var mid_num=
SWITCH(
    LEN(n),
    3,"*",
    4,"**",
    5,"***"
)
var name_out=IF(LEN(n)>2,LEFT(n,1)&mid_num&RIGHT(n,1),LEFT(n,1)&"*")
return name_out

但是这里有一个简单写法。当然,用在此处其实是大材小用,大家可以想一下在哪些场景中会用到:

代码语言:javascript复制
姓名4 = 
var n=[学生姓名]
var mid_num=LEFT("**************************",LEN(n)-2)
var name_out=IF(LEN(n)>2,LEFT(n,1)&mid_num&RIGHT(n,1),LEFT(n,1)&"*")
return name_out

以上两种方法,效果自然是一样的:

以上的技巧,比如在处理满意度调查问卷收集的数据时,我们想把打分情况的数字变为报表中的五角星个数,就可以使用这种办法结合Unicode进行了:

度量值写起来也非常简洁:

代码语言:javascript复制
满意度星标 = 
var wjx1=UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)&UNICHAR(9733)
var wjx0=UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)&UNICHAR(9734)
var wjx_out=LEFT(wjx1,[满意度])&LEFT(wjx0,10-[满意度])
return wjx_out

在处理这种根据已知的数字x一直重复x次的问题中,在其它语言中我们采用的一般是for或者while循环,而我们在DAX中采用了LEFT函数来伪造了一个这样一个循环。

有些时候从python中转到DAX里编辑度量值,往往会感觉到不适应,就是因为一个在其他语言中很简单的for循环,唯独在DAX里没法用。DAX毕竟是基于模型的语言,在对数据进行单独的处理方面有一些限制,但是放在模型中恐怕是无人能敌。

That's it!

0 人点赞