SAS有关串联运算符的一些问题||

时间:2018-10-20 05:00:39

标签: syntax sas

我对SAS中的以下程序有疑问。

 data staff;
      jobA='FA';
      jobB='1';
      jobA=jobA||jobB;
 run;

 proc print;

 run;

为什么jobA的输出仍为FA?

我认为应该对其进行更新,但是由于某些原因它仍保持不变...它必须与jobA最初定义时的原始长度做任何事情吗?

1 个答案:

答案 0 :(得分:4)

DATA步骤字符变量不同于其他编码语言中的字符串变量。每个DATA Step变量都有固定的长度。可变长度可以是:

  • 使用LENGTHATTRIBUTE语句明确声明(在首次使用之前)
  • 通过SETMERGEUPDATEMODIFY语句从提供的数据集中“继承”
  • 或从它们在数据步骤程序中的首次使用根据上下文进行推断。

正如Chris J在评论中正确回答的那样,jobA的长度为$ 2,因为它的第一次使用是上下文相关的'FA',它有两个字符。同样,jobB的长度为$ 1。

对于您的特定问题,串联结果的长度为3个字符,并存储在2个字符的变量中。将结果存储在变量中时,将发生无声(无日志消息)截断。

所有字符变量都隐式地尾部填充有其长度的空格,这在连接时是一个重要的考虑因素-有时在连接时,您会挠头问问,结果的其余部分在哪里?或者为什么会有接下来的部分之前有这么多空格?

合并值时,串联运算符(||)不会修剪尾随空格。当目标变量的长度不足以包含所有要合并的变量的长度时,这可能会引起混淆-串联似乎没有发生。在过去的盛行时期,使用编码模式trim(left(variable-1))||trim(left(variable-2))||..||trim(left(variable-n))来避免这种情况。

如今,SAS具有级联功能家族catcatscattcatxcatq)使字符表达式的组合更加容易。

考虑阅读SAS文档Step-by-Step Programming with Base SAS, Combining Character Values: Using Concatenation