为什么 trim() 函数的存在或不存在会在 SAS 中产生影响?
Why does the presence or absence of the trim() function make a difference IN SAS?
在下面的代码中,为什么存在或不存在 trim() 函数会导致 B 列和 C 列中的结果不同?
data work.ironman ;
length a $ 10 ;
input a $ @@;
cards ;
i am iron man
;
run ;
proc print ; run ;
/* Logic error */
data work.to_thanos ;
set work.ironman ;
length b 0 ;
retain b "Hey Thanos!" ; output ;
do i = a ;
c = b || " " || i ; output ; /* <- This part makes logic error.. */
b = c ; output ;
end ;
run ;
proc print ; run ;
/* Correct Results */
data work.to_thanos ;
set work.ironman ;
length b 0 ;
retain b "Hey Thanos!" ; output ;
do i = a ;
c = trim(b) || " " || i ; output ; /* <- This part which contains trim() function makes correct results */
b = c ; output ;
end ;
run ;
proc print ; run ;
下面是上面代码的执行结果。
感谢您的回答。
enter image description here
SAS 有两种变量类型。浮点数和定长字符串。如果存储到字符变量中的字符串比其定义的长度短,则变量的其余部分将用空格填充。如果字符串比变量定义的长度长,则多余的字符将丢失。如果您在没有先删除尾随空格的情况下连接变量,它们将成为结果字符串的一部分。
您将 A 定义为长度 $10,将 B 定义为长度 $100,但将其留给 SAS 猜测如何定义 I 和 C。由于 I 被初始化为值SAS 会猜测它也应该被定义为长度 $10。由于 C 被定义为 B 和 I 的串联,并且长度为 1 的字符串,SAS 会猜测您希望它的长度为 $111.
在您最终将 C 分配给 B 时,C 的最后 11 个字符(包括通过 I 复制的 A 的 10 个字符)不适合 B 的 100 个字节,因此丢失了。
SAS 现在拥有一系列 CAT..() 函数,可以更轻松地连接值。看起来您需要 CATX() 函数。
data step1 ;
set ironman ;
length b 0 ;
retain b "Hey Thanos!" ;
b = catx(' ',b,a);
run;
结果
Obs a b
1 i Hey Thanos! i
2 am Hey Thanos! i am
3 iron Hey Thanos! i am iron
4 man Hey Thanos! i am iron man
在下面的代码中,为什么存在或不存在 trim() 函数会导致 B 列和 C 列中的结果不同?
data work.ironman ;
length a $ 10 ;
input a $ @@;
cards ;
i am iron man
;
run ;
proc print ; run ;
/* Logic error */
data work.to_thanos ;
set work.ironman ;
length b 0 ;
retain b "Hey Thanos!" ; output ;
do i = a ;
c = b || " " || i ; output ; /* <- This part makes logic error.. */
b = c ; output ;
end ;
run ;
proc print ; run ;
/* Correct Results */
data work.to_thanos ;
set work.ironman ;
length b 0 ;
retain b "Hey Thanos!" ; output ;
do i = a ;
c = trim(b) || " " || i ; output ; /* <- This part which contains trim() function makes correct results */
b = c ; output ;
end ;
run ;
proc print ; run ;
下面是上面代码的执行结果。
感谢您的回答。
enter image description here
SAS 有两种变量类型。浮点数和定长字符串。如果存储到字符变量中的字符串比其定义的长度短,则变量的其余部分将用空格填充。如果字符串比变量定义的长度长,则多余的字符将丢失。如果您在没有先删除尾随空格的情况下连接变量,它们将成为结果字符串的一部分。
您将 A 定义为长度 $10,将 B 定义为长度 $100,但将其留给 SAS 猜测如何定义 I 和 C。由于 I 被初始化为值SAS 会猜测它也应该被定义为长度 $10。由于 C 被定义为 B 和 I 的串联,并且长度为 1 的字符串,SAS 会猜测您希望它的长度为 $111.
在您最终将 C 分配给 B 时,C 的最后 11 个字符(包括通过 I 复制的 A 的 10 个字符)不适合 B 的 100 个字节,因此丢失了。
SAS 现在拥有一系列 CAT..() 函数,可以更轻松地连接值。看起来您需要 CATX() 函数。
data step1 ;
set ironman ;
length b 0 ;
retain b "Hey Thanos!" ;
b = catx(' ',b,a);
run;
结果
Obs a b
1 i Hey Thanos! i
2 am Hey Thanos! i am
3 iron Hey Thanos! i am iron
4 man Hey Thanos! i am iron man