在字符串中保持尾随空白

时间:2017-11-03 08:36:40

标签: sas datastep trailing

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

如何实现TEXT=Test controltext打印?在临时数据集中有一些观察结果是尾随空白而一些没有。所以我不知道是否有一个尾随空白......

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;

2 个答案:

答案 0 :(得分:2)

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

所以:

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

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

返回:

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

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

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

将返回:

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

答案 1 :(得分:1)

您的put语句结果包含“额外”空格,因为在您的第一个datastep中,您隐含地初始化长度为10(a的长度)的变量"MyTesttext"

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

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

日志中的结果是

"MyTesttext"
"Test"

额外的空白消失了。

您可以使用compbl()来实现您描述的结果,但这只会在您只有一个尾随空白的特定情况下才是正确的。