Sas 输出字符串,其中包含要记录的前导空格,保留空格

Sas 输出字符串,其中包含要记录的前导空格,保留空格,sas,Sas,如何将前导空格打印到日志中 当我做这样的事情时 data _null_; x = ' Hello, world!'; put x; run; 结果是 2522 data _null_; 2523 x = ' Hello, world!'; 2524 putlog x; 2525 run; Hello, world! NOTE: DATA statement used (Total process time): real time 0

如何将前导空格打印到日志中

当我做这样的事情时

data _null_;
  x = '  Hello, world!';
  put x;
run;
结果是

2522  data _null_;
2523    x = '  Hello, world!';
2524    putlog x;
2525  run;

Hello, world!
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
我仔细看了一遍,但什么也看不出来。似乎使用一种格式(如)可能会起作用。然而,这需要提前知道字符串的长度

我希望日志输出如下所示:

  Hello, world!  (<--edited by hand to display leading spaces)
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
你好,世界!(使用
+2
(或无论多长)与put(但不是putlog)一起使用

使用
putlog
时,您必须:

使用
+2
(或无论多长)与put(但不是putlog)一起工作

使用
putlog
时,您必须:


您可以尝试使用不可打印的字符-同时适用于put和putlog

data _null_;
  x = '09'x !! '       Hello, world!';
  putlog x;
run;
在日志中创建“空白”的其他方法包括:

data _null_;   
  x = '09'x !! '       Hello, world!';   
  put // x // '09'x; 
run;
/
允许您添加一个空行

此外,您还可以通过添加破折号将日志的部分分类为注释/警告/错误,如下所示:

data _null_;
  put 'NOTE: ';
  put 'NOTE- Check';
  put 'NOTE- This';
  put 'NOTE- Out!';
  put 'NOTE- ';
run;

您可以尝试使用不可打印的字符-同时适用于put和putlog

data _null_;
  x = '09'x !! '       Hello, world!';
  putlog x;
run;
在日志中创建“空白”的其他方法包括:

data _null_;   
  x = '09'x !! '       Hello, world!';   
  put // x // '09'x; 
run;
/
允许您添加一个空行

此外,您还可以通过添加破折号将日志的部分分类为注释/警告/错误,如下所示:

data _null_;
  put 'NOTE: ';
  put 'NOTE- Check';
  put 'NOTE- This';
  put 'NOTE- Out!';
  put 'NOTE- ';
run;

因此,如果只想添加前导空格,可以使用@n指针控件

putlog @3 x ;
如果要有条件地构建X,使其仅在某些情况下具有前导空格,则可以使用
$variable.
格式。您需要定义一个具有希望写入长度的变量,但无需修改所使用的格式

166  data _null_;
167    do i=3 to 1 by -1 ;
168       x = substr('  Hello, world!',i);
169       len = length(x);
170       putlog x $varying80. len ;
171    end;
172  run;

Hello, world!
 Hello, world!
  Hello, world!

因此,如果只想添加前导空格,可以使用@n指针控件

putlog @3 x ;
如果要有条件地构建X,使其仅在某些情况下具有前导空格,则可以使用
$variable.
格式。您需要定义一个具有希望写入长度的变量,但无需修改所使用的格式

166  data _null_;
167    do i=3 to 1 by -1 ;
168       x = substr('  Hello, world!',i);
169       len = length(x);
170       putlog x $varying80. len ;
171    end;
172  run;

Hello, world!
 Hello, world!
  Hello, world!

我使用了@Joe的答案并根据它构建。结果表明,
+
指针控件是动态的。也就是说,指针位置可以由数据集变量控制。这对于不知道将有多少空格的情况非常有用

211  data _null_;
212    string         = '       Hello, world!';
213    len_string     = length(string);
214    len_stripped   = length(strip(string));
215    leading_spaces = len_string - len_stripped;
216
217    put len_string= len_stripped= leading_spaces= ;
218    put;
219    put +leading_spaces string;
220  run;

len_string=20 len_stripped=13 leading_spaces=7

       Hello, world!
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

我使用了@Joe的答案并根据它构建。结果表明,
+
指针控件是动态的。也就是说,指针位置可以由数据集变量控制。这对于不知道将有多少空格的情况非常有用

211  data _null_;
212    string         = '       Hello, world!';
213    len_string     = length(string);
214    len_stripped   = length(strip(string));
215    leading_spaces = len_string - len_stripped;
216
217    put len_string= len_stripped= leading_spaces= ;
218    put;
219    put +leading_spaces string;
220  run;

len_string=20 len_stripped=13 leading_spaces=7

       Hello, world!
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

需要明确的是,
@
既没有打印任何内容,也不是不可打印的字符-它是一个指针控件,但它避免了编译器/解析器认为
putlog
是一个名为
putlog
的变量,而不是一个语句/函数[因为
putlog+2
如果是,它将是一个合法的SAS语句]。(虽然
put
显然作为一个语句/函数获得了优先级,
putlog
没有获得那个级别的首选项。可能是因为它较新,所以避免了向后兼容性问题。)没有真正解决输出变量中前导空格的问题。@Tom你为什么这么说?对我来说确实如此。或者你的意思是当变量本身包含空格时。我想没有,但这似乎不是一个重要的问题。
H
应该在第5列,因为你跳过了two空格,变量有两个前导空格,但它在第3列中。需要明确的是,
@
既不打印任何内容,也不是不可打印的字符-它是指针控件,但它避免了编译器/解析器认为
putlog
是名为
putlog
的变量,而不是语句/函数[因为
putlog+2
如果是的话将是一个合法的SAS语句)。(虽然
put
显然作为一个语句/函数获得了优先权,
putlog
没有获得那个级别的优先权。大概是因为它比较新,所以避免了向后兼容性问题。)没有真正解决输出变量中前导空格的问题。@Tom你为什么这么说?对我来说确实如此。或者你的意思是当变量本身包含空格时。我想没有,但这似乎不是一个重要的问题。
H
应该在第5列,因为你跳过了two空格,变量有两个前导空格,但它在第3列中。