【问题标题】:Output string with leading spaces to log, keeping the spaces输出带有前导空格的字符串以记录,保留空格
【发布时间】:2017-04-02 23:23:41
【问题描述】:

如何在日志中打印前导空格?

当我做类似的事情时

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

我查看了PUT documentation,但没有什么特别突出的。似乎使用$CHARw. 之类的格式可能会起作用。但是,这需要提前知道字符串的长度。

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

  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

【问题讨论】:

    标签: sas


    【解决方案1】:

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

    putlog @3 x ;
    

    如果您想有条件地构建 X 以使其有时仅具有前导空格,则可以使用 $varying. 格式。您需要定义一个具有您想要写入的长度的变量,但您不需要修改使用的格式。

    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!
    

    【讨论】:

      【解决方案2】:

      使用+2(或不管有多长)与put(但不是putlog)一起使用。

      data _null_;
        x = '  Hello, world!';
        put +2 x $;
      run;
      

      使用putlog 你必须add an @ or something similar to trick the compiler:

      data _null_;
        x = '  Hello, world!';
        putlog @ +2 x $;
      run;
      

      【讨论】:

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

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

      data _null_;
        x = '09'x !! '       Hello, world!';
        putlog x;
      run;
      

      在日志中创建“空白”的其他方法包括:

      data _null_;   
        x = '09'x !! '       Hello, world!';   
        put // x // '09'x; 
      run;
      

      / 允许您添加一个空行。

      此外,您可以通过添加破折号将日志的部分分类为 NOTE / WARNING / ERROR,如下所示:

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

      【讨论】:

        【解决方案4】:

        我使用了@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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2013-06-03
          相关资源
          最近更新 更多