在字符串中保留尾随空白

Keep trailing blank in string

我有以下带有 2 个观测值的临时数据集。 第二个观察包含一个尾随 blank.In data _null_ 步骤,我使用 call symput 从第二个观察中读取值。 在 put 语句中,值被写入带有 6 个空格的日志:TEXT=Test controltext.

如何打印 TEXT=Test controltext?在临时数据集中,有些观察结果带有尾随空白,有些观察结果带有 none。所以不知道后面有没有空格...

data temp;
  a="MyTesttext";
  output;
  a="Test ";
  output;
run;

data _null_;
  set temp;
  if _n_ = 2 then do;
    call symput('text',a);
  end;
run;

%put &=text.controltext;

您的 put 语句结果包含 "extra" 空白,因为在您的第一个数据步骤中,您隐式初始化了长度为 10 的变量 a"MyTesttext" 的长度).

一旦长度为 10 的变量 a 被赋值为 "Test ",多余的尾随空白就基本上丢失了。 您可以通过 运行 观察到以下内容:

data _null_;
  a="MyTesttext";
  put '"' a +(-1) '"';
  a="Test ";
  put '"' a +(-1) '"';
run;

日志中的结果是

"MyTesttext"
"Test"

多余的空白不见了。

您可以使用 compbl() 获得您所描述的结果,但这仅在您只有一个尾随空白的这种特殊情况下才是正确的。

在DATA步语言中,在字符变量中,如果值的长度小于变量的长度,则用尾随空格填充。当您编写 a="Test "(一个尾随空格)或 a="Test "(三个尾随空格)并且变量 A 的长度定义为 $10 时,它们都存储有六个尾随空格。

所以:

data _null_;
  length a ;
  a="Test ";
  call symput('TextOneBlank',a);
  a="Test   ";
  call symput('TextThreeBlanks',a);
run;

%put >>&TextOneBlank<<;
%put >>&TextThreeBlanks<<;

returns:

75   %put >>&TextOneBlank<<;
>>Test      <<
76
77   %put >>&TextThreeBlanks<<;
>>Test      <<

保留固定数量的尾随空格的一种方法是将您自己的定界符添加到文本值中,这样它们实际上就不是尾随空格。例如,您可以使用竖线作为分隔符:

data _null_;
  length a ;
  a="|Test |";
  call symput('TextOneBlank',scan(a,1,'|'));
  a="|Test   |";
  call symput('TextThreeBlanks',scan(a,1,'|'));
run;

这将 return:

86   %put >>&TextOneBlank<<;
>>Test <<
87   %put >>&TextThreeBlanks<<;
>>Test   <<