楼主: yzsxdlcc
10154 5

[问答] 关于length长度问题? [推广有奖]

  • 9关注
  • 2粉丝

已卖:3份资源

博士生

17%

还不是VIP/贵宾

-

TA的文库  其他...

sas

威望
0
论坛币
3013 个
通用积分
0
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
14694 点
帖子
71
精华
0
在线时间
434 小时
注册时间
2012-5-26
最后登录
2021-1-15

楼主
yzsxdlcc 发表于 2013-1-7 18:23:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
首先数据集:

  1. data test1;
复制代码


对上面的数据集做如下处理:

  1. data test2;
复制代码


运行结果:

obs            id       a   b  b1  c              d                   d1                e                    e1     f    f1
1       123456     12   6    1   6    123456                     7      123456                      7     6    1
2           5555     12   5    1   4            5555                 9              5555                  9     5    1
3             321     12   1    1   3                 321             10                 321              10     1    1
4                 1     12   1    1   1                         1         12                           1        12     1    1


a:    id字符串长度
b:    截取id的最后一个数字
b1:  查看b的长度,b的每条记录的长度都为1
c:    对id去掉空格后查看id的长度,123456为长度为6,  5555长度为4, 321长度为3,   1的长度为1  

到上面为止,跑出来的结果和预想中的是一样。

d:   对id截取id去掉空格后的长度,结果跑出来之后发现d的结果如上面所示。

一开始,我认为d是按实际储存的形式(长度为12)列了出来,可当我查看d的长度的时候,却发现并非这样,123456的长度居然是7,   5555按这样截取之后的长度居然是9.。。

突然我想是不是substr()函数的关系。。

再测试了一次

  1. data test3;
复制代码
结果:

obs   id          a         b          c
1    123456    6     123456
2        5555    5         5555
3          321    1           321
4              1    1               1

这里12刚好等于id的长度,所以截取出了id的最后一位;而3小于id的长度,结果把整个id都显示出来了;而c超过了id的长度,截取出来为空。

回到数据集test2, 这里的d=substr(id,length(compress(id,,'kd')));应该是length(compress(id,,'kd'))小于id的长度,所以全部截取出来。


可我的问题是,全部截取出来,d1应该全部都是12啊?为什么是那么奇怪的数字?
=============================

接下来,我又想是不是id本身有空格影响了截取本身。。。

所以我测试了e这个数据,使用了trim()去掉了id的空格,可结果跑出来依旧不对,长度也不对。。

问题:这里的trim()没起到作用,id的长度仍为原来的长度?


于是我想到了compress()压缩空格的方法,取了f,查看了f的长度,结果发现f和b是相同的,f1和b1是相同的,正是我想的结果。


compress()函数和trim()去空格的功能是不是在于id的长度是否变化?trim()函数使用后还是原来的变量,而compree(id,,'kd')相当于一个新变量,所以长度不同?


===========================================


我也不知道我说清楚了没有,大概问题就是上面这些。。。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:length leng eng compress SUBSTR 字符串

从骨感走向丰满

文库

沙发
yzsxdlcc 发表于 2013-1-7 18:26:02
原帖代码不知道为啥,显示不出来,我回复一个。。。问题在下面

=========================================


首先数据集:

data test1;
input id;
cards;
123456   
    5555      
       321
          1
;
run;


对上面的数据集做如下处理:

data test2;
set test1;
a=length(id);
b=substr(id,length(id));
b1=length(b);
c=length(compress(id,,'kd'));
d=substr(id,length(compress(id,,'kd')));
d1=length(d);
e=substr(trim(id),length(compress(id,,'kd')));
e1=length(e);
f=substr(compress(id,,'kd'),length(compress(id,,'kd')));
f1=length(f);
run;
proc print;
run;


运行结果:

obs            id       a   b  b1  c              d                   d1                e                    e1     f    f1
1       123456     12   6    1   6    123456                     7      123456                      7     6    1
2           5555     12   5    1   4            5555                 9              5555                  9     5    1
3             321     12   1    1   3                 321             10                 321              10     1    1
4                 1     12   1    1   1                         1         12                           1        12     1    1


a:    id字符串长度
b:    截取id的最后一个数字
b1:  查看b的长度,b的每条记录的长度都为1
c:    对id去掉空格后查看id的长度,123456为长度为6,  5555长度为4, 321长度为3,   1的长度为1  

到上面为止,跑出来的结果和预想中的是一样。

d:   对id截取id去掉空格后的长度,结果跑出来之后发现d的结果如上面所示。

一开始,我认为d是按实际储存的形式(长度为12)列了出来,可当我查看d的长度的时候,却发现并非这样,123456的长度居然是7,   5555按这样截取之后的长度居然是9.。。

突然我想是不是substr()函数的关系。。

再测试了一次

data test3;
set test1;
a=substr(id,12);
b=substr(id,3);
c=substr(id,13);
run;
结果:

obs   id          a         b          c
1    123456    6     123456
2        5555    5         5555
3          321    1           321
4              1    1               1

这里12刚好等于id的长度,所以截取出了id的最后一位;而3小于id的长度,结果把整个id都显示出来了;而c超过了id的长度,截取出来为空。

回到数据集test2, 这里的d=substr(id,length(compress(id,,'kd')));应该是length(compress(id,,'kd'))小于id的长度,所以全部截取出来。


可我的问题是,全部截取出来,d1应该全部都是12啊?为什么是那么奇怪的数字?
=============================

接下来,我又想是不是id本身有空格影响了截取本身。。。

所以我测试了e这个数据,使用了trim()去掉了id的空格,可结果跑出来依旧不对,长度也不对。。

问题:这里的trim()没起到作用,id的长度仍为原来的长度?


于是我想到了compress()压缩空格的方法,取了f,查看了f的长度,结果发现f和b是相同的,f1和b1是相同的,正是我想的结果。


compress()函数和trim()去空格的功能是不是在于id的长度是否变化?trim()函数使用后还是原来的变量,而compree(id,,'kd')相当于一个新变量,所以长度不同?


===========================================


我也不知道我说清楚了没有,大概问题就是上面这些。。。
从骨感走向丰满

文库

藤椅
pobel 在职认证  发表于 2013-1-7 19:37:24
yzsxdlcc 发表于 2013-1-7 18:26
原帖代码不知道为啥,显示不出来,我回复一个。。。问题在下面

====================================== ...
1. 关于d的长度d1;
     d=substr(id,length(compress(id,,'kd')));
        d1=length(d);
首先,substr()函数要求的第一个参数是字符型,如果是数值型则会有数据类型的自动转换。
正如此例中,id为数值型,所以会自动转换成字符型,默认的格式是best12.
例如第一个id:123456,转换后就是“      123456”,前面六个空格。

再看substr()的第二个参数,为将id的值compress(即去掉空格)后的长度,显然为6,
因此就相当于d=substr(“      123456”,6);结果就是“ 123456”。

接下来,d1=length(" 123456"); d的长度自然就是7了。

(这里要注意的是数值型向字符型自动转换格式best12.,转换后会造成前面有空格)


2.关于trim()

trim()函数是将某个字符串后面的空格去掉(trailing space),不会去掉前面的空格(leading space)。
相对应的left()函数会去掉前面的空格。
strip()函数则可将前面和后面的空格都去掉。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
yzsxdlcc + 1 + 1 + 1 热心帮助其他会员
Imasasor + 12 + 60 + 2 + 2 + 2 分析的有道理

总评分: 经验 + 12  论坛币 + 60  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

和谐拯救危机

板凳
henryyhl 发表于 2013-1-8 08:38:46
学习了,受教
请问楼上教授,数值型变量转换成字符型是不是$12.?best12.是不是数值型的格式?谢谢
It's not going to be easy, but it is going to be worth it.

报纸
yzsxdlcc 发表于 2013-1-8 10:01:36
henryyhl 发表于 2013-1-8 08:38
学习了,受教
请问楼上教授,数值型变量转换成字符型是不是$12.?best12.是不是数值型的格式?谢谢
best12.是不是数值型的格式?

是。

测试一下
  1. data aa;
  2. informat a best12.;
  3. input a;
  4. cards;
  5. 11111111
  6. abcde
  7. ;
  8. run;

  9. proc print;
  10. run;
复制代码
----这个可以看出,字符型的数据abcde并没有录入

  1. proc contents data=aa;
  2. run;
复制代码

----查看数据集也可以看出变量a的类型是数值型的。

====================
数值型变量转换成字符型是不是$12.?



测试:
  1. data bb;
  2. set aa;
  3. c=substr(a,11);
  4. run;

  5. proc contents data=bb;
  6. run;
复制代码
可以查看到数据集bb中的变量c为字符型变量且长度为12.
从骨感走向丰满

文库

地板
yzsxdlcc 发表于 2013-1-8 10:07:25
pobel 发表于 2013-1-7 19:37
1. 关于d的长度d1;
     d=substr(id,length(compress(id,,'kd')));
        d1=length(d);
受教,是我对substr()函数的理解不够。

Substr(s,p,n)函数,其中s必须是字符型,这点我不清楚。同时,如果缺失n的话,SAS则会提取p后面全部字符,这里导致我计算d=substr(id,length(compress(id,,'kd')))的时候对d1=length(d)一直不能理解。

trim()函数我以为和oracle是一样的,去除所有空格。。汗。。

非常感谢。
从骨感走向丰满

文库

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 17:49