REPEAT函数如何处理字符串尾随空格?SAS输出相关疑问咨询
SAS中REPEAT函数输出与长度计算的疑问解析
问题描述
我无法理解为何输出的C2列中,第二、第三个观测值的复制字符串与重复字符串之间仅存在一个空格(显示为'XXX XXX'和'Y Y'),而'XXX'带有5个尾随空格、'Y'带有7个尾随空格?这与LC2列的结果是否存在冲突?
原SAS代码
DATA EXAMPLE1; INPUT GROUP @10 STRING $3.; LEFT = 'X '; RIGHT = ' X'; C1 = SUBSTR(GROUP,1,2) ; C2 = REPEAT(GROUP,1); LGROUP = LENGTH(GROUP) ; LSTRING = LENGTH(STRING) ; LLEFT = LENGTH(LEFT); LRIGHT = LENGTH(RIGHT); LC1 = LENGTH(C1); LC2 = LENGTH(C2); DATALINES; ABCDEFGH 123 XXX 4 Y 5 ;
核心解析
1. 字符变量的存储长度与有效长度
SAS中字符变量的存储长度由第一次读取的最长值决定,这里第一行的ABCDEFGH长度为8,所以GROUP的存储长度固定为8。但LENGTH()函数返回的是变量值的有效长度——即从第一个非空格字符到最后一个非空格字符的长度,不含尾随空格:
- 第二行数据
XXX 4:GROUP存储的是XXX加5个尾随空格,但LENGTH(GROUP)返回3(仅统计有效字符)。 - 第三行数据
Y 5:GROUP存储的是Y加7个尾随空格,LENGTH(GROUP)返回1。
2. REPEAT函数的实际行为
REPEAT(GROUP,1)仅对GROUP的**有效值(不含尾随空格)**进行1次重复,所以C2的有效值就是XXX或Y,存储时会自动补空格到8位(和GROUP的存储长度一致)。你看到的XXX XXX或Y Y是PROC PRINT的显示错觉——实际是有效字符加尾随空格的对齐显示,并非字符串重复两次。
3. 与LC2列结果无冲突
LC2 = LENGTH(C2)返回的是C2的有效长度,和LGROUP完全一致(3和1),这完全合理:因为C2的有效值就是GROUP的有效值,长度自然相同,不存在冲突。
内容的提问来源于stack exchange,提问作者Life is BS
相关产品推荐
相关产品推荐

