【问题标题】:Keep trailing blank in string在字符串中保持尾随空白
【发布时间】:2018-04-15 22:20:39
【问题描述】:

我有以下带有 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;

【问题讨论】:

  • 变量 A 中的“Test”后面有六个尾随空格,因为变量 A 的长度为 10。您的目标是在宏变量 &text 的值中保留一个尾随空格吗?跨度>
  • 正确,我想保留写入变量 a 的尾随空白。
  • 在另一条评论中你说如果有两个尾随空格,你想保留它们。在这种情况下,有 6 个尾随空格而不是一个。但你只想保留一个?如果分配给 A 的值是“文本”,你想保留两个空格吗?由于 A="text" 和 A="text" 都有六个尾随空格,因此您无法区分它们。
  • 我想保留temp字符串中给出的空格。在上面的例子中,有一个空格。如果有 2 个或更多空白,我想保留这些空白。

标签: sas datastep trailing


【解决方案1】:

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

一旦将长度为 10 的变量 a 赋值为 "Test ",则该额外的尾随空白基本上会丢失。 您可以通过运行以下命令来观察:

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

日志中的结果是

"MyTesttext"
"Test"

多余的空白消失了。

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

【讨论】:

  • 嗯,所以我必须指定:如果我有 2 个尾随空格,我也想保留它们。正如您已经提到的那样,这是不可能的compbl()
  • 当使用put 在数据步中输出时,另一种方法是附加一些内容,然后通过将光标移回 2 个字符将其删除,如下所示:a=cat("Test ", '|');put '"' a +(-2) '"';
【解决方案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   <<

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 2014-02-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2017-05-24
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多