我对SAS中的以下程序有疑问。
data staff;
jobA='FA';
jobB='1';
jobA=jobA||jobB;
run;
proc print;
run;
为什么jobA的输出仍为FA?
我认为应该对其进行更新,但是由于某些原因它仍保持不变...它必须与jobA最初定义时的原始长度做任何事情吗?
答案 0 :(得分:4)
DATA步骤字符变量不同于其他编码语言中的字符串变量。每个DATA Step变量都有固定的长度。可变长度可以是:
LENGTH
或ATTRIBUTE
语句明确声明(在首次使用之前)SET
,MERGE
,UPDATE
或MODIFY
语句从提供的数据集中“继承” 正如Chris J在评论中正确回答的那样,jobA
的长度为$ 2,因为它的第一次使用是上下文相关的'FA'
,它有两个字符。同样,jobB
的长度为$ 1。
对于您的特定问题,串联结果的长度为3个字符,并存储在2个字符的变量中。将结果存储在变量中时,将发生无声(无日志消息)截断。
所有字符变量都隐式地尾部填充有其长度的空格,这在连接时是一个重要的考虑因素-有时在连接时,您会挠头问问,结果的其余部分在哪里?或者为什么会有接下来的部分之前有这么多空格?
合并值时,串联运算符(||
)不会修剪尾随空格。当目标变量的长度不足以包含所有要合并的变量的长度时,这可能会引起混淆-串联似乎没有发生。在过去的盛行时期,使用编码模式trim(left(variable-1))||trim(left(variable-2))||..||trim(left(variable-n))
来避免这种情况。
如今,SAS具有级联功能家族(cat
,cats
,catt
,catx
,catq
)使字符表达式的组合更加容易。
考虑阅读SAS文档Step-by-Step Programming with Base SAS, Combining Character Values: Using Concatenation