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

电子说

1.3w人已加入

描述

我们经常会看到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

  可以看到,由于中文字符在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;

结果如下:

UTF-8

  可以看到,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;

结果如下:

UTF-8

  可以看到,用substr提取出的字符串出现了乱码,这是因为substr函数提取字符时是按字节来提取的,中文字符在utf-8编码时为3个字节,所以提取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。此时用ksubstrb函数就可以避免出现乱码的情况,它会舍弃最后一个不完整字符,从而保证不会出现显示上的乱码。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分