为什么 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