【问题标题】:How to pad out character fields in SAS?如何在 SAS 中填充字符字段?
【发布时间】:2011-12-23 18:22:07
【问题描述】:

我正在从包含 VARCHAR(5) 键字段的数据库创建 SAS 数据集。

此字段包括一些使用全部 5 个字符的条目和一些使用较少字符的条目。

当我导入此数据时,我希望将所有较短的条目都填充出来以使用所有五个字符。对于此示例,我想在左侧填充 0,即字符零。因此,114 将变为 00114ABCD 将变为 0ABCDEA222 将保持原样。

我已经尝试过使用简单的数据语句,但当然以下不起作用:

data test;
    set databaseinput;
    format key $5.;
run;

我已尝试使用用户定义的信息来执行此操作,但我认为无法根据 this SAS KB answer 在字符字段上正确指定范围。另外,我很确定 proc 格式不会让我根据传入变量动态定义结果。

我确信这里有一个明显的解决方案,但我只是想念它。

【问题讨论】:

  • 你想如何处理ABC?应该是00ABC
  • 是的,00ABC 在我的情况下是正确的。另外,关于使用代码标签的好点。原帖已更新。
  • 条目可以包含空格吗?例如AB_C 甚至_AB_(下划线代表空格)?

标签: sas


【解决方案1】:

我相信有人会有更优雅的解决方案,但以下代码有效。本质上它是用五个前导零填充变量,然后反转此文本字符串的顺序,使零在右侧,然后再次反转此文本字符串并将大小限制为五个字符,按原始顺序但左填充用零。

data raw_data_dsn;
   format key $varying5.;
   key = '114'; output;
   key = 'ABCD'; output;
   key = 'EA222'; output;
run;

data padded_data_dsn;
   format key $5.;
   drop raw_data;
   set raw_data_dsn(rename=(key=raw_data));
   key = put(put('00000' || raw_data ,$revers10.),$revers5.);
run;

【讨论】:

  • 我花了很长时间来验证这个答案,但它正好解决了我的问题。
【解决方案2】:

这是另一种选择:

data padded_data_dsn; length key $5;
    drop raw_data;
    set raw_data_dsn(rename=(key=raw_data));
    key = translate(right(raw_data),'0',' ');
run;

【讨论】:

    【解决方案3】:
    Data raw_data_dsn;
    format key $5.;
    key = '4'; key1 = CATT(REPEAT('0',5-length(key)),key);output;
    key = 'A114'; key1 = CATT(REPEAT('0',5-length(key)),key);output;
    key = 'A1140'; key1 = CATT(REPEAT('0',5-length(key)),key);output;
    run;
    

    【讨论】:

      【解决方案4】:

      这对我有用。

      data b (keep = str2);
          format str2 $5. ;
          set a;
          catlength = 4 - length(str); 
          cat = repeat('0', catlength);
          str2 = catt(cat, str); 
      run;
      

      它的工作原理是计算现有字符串的长度,然后创建一个长度为 4 的 cat 字符串,然后将 cat 值和原始字符串附加在一起。

      请注意,如果原始字符串的长度为 5,它会搞砸。 另外 - 如果输入字符串有 $5,它将不起作用。格式就可以了。

      data a; /*input dataset*/
          input str $;
          datalines;
          a
          aa
          aaa
          aaaa
          aaaaa
          ;
      run;
      
      data b (keep = str2);
          format str2 $5. ;
          set a;
          catlength = 4 - length(str); 
          cat = repeat('0', catlength);
          str2 = catt(cat, str); 
      run;
      
      input:
      a
      aa
      aaa
      aaaa
      aaaaa
      
      output:
      0000a   
      000aa   
      00aaa   
      0aaaa   
      0aaaa   
      

      【讨论】:

        【解决方案5】:

        我使用它,但仅适用于数值:S。尝试在 INPUT 中使用其他格式

        data work.prueba;
            format xx $5.;
            xx='1234';
            vv=PUT(INPUT(xx,best5.),z5.);
        run;
        

        【讨论】:

          猜你喜欢
          • 2019-02-24
          • 2018-05-15
          • 2018-04-09
          • 1970-01-01
          • 2016-02-25
          • 2012-01-22
          • 1970-01-01
          • 1970-01-01
          • 2010-09-29
          相关资源
          最近更新 更多