SAS:length,klength,substr,ksubstr,ksubstrb的区别

我们经常会看到klength,ksubstr,以及kscan等一系列的函数,由此会产生疑惑,加k和不加k两者之间有什么区别和联系。当我们在做项目的时候发现有时候不加k也能实现我们想要得到的结果,但是有时候则会出现乱码的情况,尝试加上k后就可以完美规避掉乱码这个问题,为什么会出现这样的问题呢?本文告诉你答案。
原来加k是以字符为基础进行处理,也就是你数字符串中有几个字符就是几个字符,而不加k是以字节为基础进行处理。我们知道在sas中文简体中一个汉字(标点)占两个字节,一个数字占一个字节;在sas utf-8中一个汉字(标点)占三个字节,数字占一个字节,但是sas 英文版字符和数字都占一个字节,所以在此环境下klength和length、substr和ksubstr的功能是一样的,下面我举三个例子,以utf-8为例:
一、klength和length
例1:计算test数据集中topic这个字符变量的长度
data test;
input topic $20.; cards;话题topic 1
话题topic 2
话题topic 3
话题topic 4
话题topic 5
;
run;
data all1;
set test; topic1=klength(topic); topic2=length(topic);run;
结果如下:
可以看到,由于中文字符在utf-8编码时为3个字节, 而length函数计算的是字节长度,会把一个汉字当成3个长度,数字当做1个长度,所以计算结果为2*3+7=13。而klength函数会忽略全角半角,统一把汉字和数字都当做1个长度,所以计算结果为9。
二、ksubstr和substr
例2:提取test数据集中topic中前六位的值
data all2;
set test; topic1=substr(topic,1,6); topic2=ksubstr(topic,1,6);run;
结果如下:
可以看到,substr提取出的字符串为“话题”, 而ksubstr提取出了前六个字符”话题topi”,所以还是和上面的例子是一个道理,以k开头的是以字符为基础提取字符串,而不以k开头的以字节为基础提取,但是有时我们会遇到用substr提取出的字符串出现乱码的情况,出现这种情况后要怎样解决呢,看下面一个例子。
三、substr和ksubstrb
例3:提取test数据集中topic中前5位的字符串
data all3;
set test; topic1=substr(topic,1,5); topic2=ksubstr(topic,1,5); topic3=ksubstrb(topic,1,5);run;
结果如下:
可以看到,用substr提取出的字符串出现了乱码,这是因为substr函数提取字符时是按字节来提取的,中文字符在utf-8编码时为3个字节,所以提取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。此时用ksubstrb函数就可以避免出现乱码的情况,它会舍弃最后一个不完整字符,从而保证不会出现显示上的乱码。

USB开发的这个错误你犯了吗
英国制造新型硅基可持续使用60年的LED灯泡
机器人“刷机”将带来市场的一轮洗牌?
怎样将一个开源游戏移植给一款32位微控制器
全自动增压泵型号及选型
SAS:length,klength,substr,ksubstr,ksubstrb的区别
移动宽带将会在2014年成为中国宽带市场主流
眼镜清洗机胶粘剂方案浅析、汇巨电子电器胶粘剂应用解决方案!
计算机网络给我们的生活带来了哪些负面影响
三相无刷电机逆变器的热性能优化及解决方案
AR+ADAS 如何改变汽车行业
RFID技术在新零售上可以如何应用上
STM32定时器基本计数原理解析
先进的清洗技术如何助力先进节点实现最佳晶圆良率
自力式压力调节阀的材料工作压力与温度介质
三星OLED屏幕再出新品 有望获2019年版iPhone采用
苹果公司iPhone中国市场销量低迷 需要专门为中国市场设计一款新手机
村田针对车载电源电路发布多层电感器“LQM18DH_70系列
!销售/收购HP6674A直流电源HP6674A 小兵/李S
人脸核验终端设备门禁考勤应用