正所谓理想很丰满,现实很骨感。实际的数据整理中有不少情况下在所需要拆分的数据里是找不有规律的间隔符可以用做拆分依据的。例如下面统计文件大小的表单示例中,由于终端用户的豪放填写,导致记录大小的数字和单位并没有形成统一规律,用常规的通过空格或者右侧截取后两位字符的方式是无法对数据进行拆分的。
对于这种数字+字母或者字母+数字类型的文本,即使没有统一的间隔符也是可以进行拆分的,思路为:
- 先看数据格式,如果有些行包含空格,有一些没有,为了方便截取,需要先将空格去掉,保证要替换的内容只有数字和字母。去掉空格的方法用SUBSTITUTE函数即可
RemoveSpace = SUBSTITUTE([File Size]," ","")
- 清除掉空格后下一步开始考虑截取,从数据的结构特点来看,所有行都是以数字开头,字母结尾,因此可以考虑用LEFT函数截取数字部分,之后再用RIGHT函数截取字母部分。
此处的难点在于到底要截取几位才能将数字和字母分离。可以考虑数数每一行一共有多少个数字,然后按照数字个数进行截取即可。例如第一行的150K一共有三个数字,分别是1,5,0。如果按照3位从左侧截取,就可以获得150这个结果,就完成了将数字分离出来的目的。
这样,下一个函数公式就应该是计算每一行文本中数字的个数。计算思路是,先用LEN函数计算整个文本字符的个数,然后再减去字母的个数,即可得到数字的个数。
哈,好,现在难点又变成如何计算字母的个数了。这里面用了一个小的技巧,就是可以将每一行文本中的数字都去掉,这样得到一个纯字母字符串,再用LEN计算这个字符串长度即可。去掉数字的方法很直接,就是用SUBSTITUTE函数将所有的数字都替换成空(也就是双引号中没有任何内容)。此处之所以要把数字去掉而不是字母,主要考虑的是数字只有0-9外加小数点(.)总共只有11个符号,而英文字母有26个字符,如果换成中文就要有3000多个,用SUBSTITUTE来挨个替换是不现实的,去掉数字所用的公式为:
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE([File Size],"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),".","")
注意:此处必须使用多层嵌套,因为在DAX语言中不支持类似于在Excel中使用SUBSTITUTE的方法用大括号({})将要替换的多个值罗列出来。
- 去掉数字后就可以计算文本中字母的个数,然后再用原始文本中总的字符串个数减去字母个数即可获得数字的个数。具体公式如下:
CountOfNumber = LEN(Sheet1[File Size])-LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Sheet1[File Size],"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),".",""))
- 得到数字的个数之后就可以利用LEFT函数进行截取,具体公式如下:
Number = LEFT([RemoveSpace],[CountOfNumber])
- 拆分数字成功之后就可以利用RIGHT函数将字母拆分出来。具体公式是:
Unit = RIGHT(Sheet1[RemoveSpace],LEN(Sheet1[RemoveSpace])-Sheet1[CountOfNumber])
这样,拆分数字+字母形式的文本就完成了,同样原理还可以拆分字母+数字形式的。不过从实际操作来看,对这种没有特殊分隔符的数据在Power BI中通过DAX语言进行拆分并不是最好的选择,因为DAX可以调用的方法有限。如果可以的话,最好在将数据导入到Power BI前就对原始数据进行规整,以便利用更多的公式,工具方法等进行数据拆分。