首页 > 解决方案 > SAS 关于连接运算符的一些问题 ||

问题描述

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

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

 proc print;

 run;

为什么jobA的输出还是FA?

我认为它应该更新,但由于某种原因它保持不变......它是否必须对首次定义时的 jobA 的原始长度做任何事情?

标签: syntaxsas

解决方案


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

  • LENGTHorATTRIBUTE语句显式声明(在首次使用之前),
  • 通过 、 或 语句从贡献数据集SET“继承” MERGEUPDATEMODIFY
  • 或者从它们在数据步骤程序中的第一次使用中推断出来。

正如 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


推荐阅读