我对 SAS 中的以下程序有疑问。
data staff;
jobA='FA';
jobB='1';
jobA=jobA||jobB;
run;
proc print;
run;
为什么jobA的输出还是FA?
我认为它应该更新,但由于某种原因它保持不变...它与 jobA 首次定义时的原始长度有什么关系吗?
最佳答案
DATA 步骤字符变量与其他编码语言中的字符串变量不同。每个数据步变量都有固定的长度。可变长度可以是:
- 使用
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
关于syntax - SAS 关于串联运算符 || 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902581/