SAS:从csv读取时,如何在字符变量中填充零

时间:2018-09-21 13:53:39

标签: sas

我的大部分数据都是以固定宽度格式读取的,例如fixedwidth.txt:

00012000ABC
0044500DEFG
345340000HI
00234000JKL
06453MNOPQR

前5个字符为colA,后6个字符为colB。读取该代码的代码类似于:

infile "&path.fixedwidth.txt" lrecl = 397 missover;
input   colA    $5.
        colB    $6.
;
label  colA  = 'column A  '
       colB  = 'column B  '
;
run;

但是我的某些数据来自其他地方,并且被格式化为csv,且没有前导零,例如example.csv:

colA,colB
12,ABC
445,DEFG
34534,HI
234,JKL
6453,MNOPQR

由于将csv数据添加到从固定宽度文件读取的现有数据中,因此我想完全匹配格式。

到目前为止,我在example.csv中阅读的代码是:

data work.example;
    %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
    infile "&path./example.csv" delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
    informat colA $5.;
    informat colB $6.;
    format colA z5.; *;
    format colB z6.; *;
    input
    colA $
    colB $
    ;
    if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro variable */
run;

但是格式为z5。 &z6。仅适用于格式化为数字的列,因此它不起作用并提供以下输出:

ColA     colB
12       ABC
445      DEFG
34534    HI
234      JKL
6453     MNOPQR

我想要的时候:

ColA     colB
00012    000ABC
00445    00DEFG
34534    0000HI
00234    000JKL
06453    MNOPQR

两列均设置为字符。

理想情况下,我想找到一种仅使用格式和informats来获得所需输出的方法,以使代码易于理解(我有很多专栏来跟踪!)。

感谢任何建议!

2 个答案:

答案 0 :(得分:0)

您可以使用cats强制将csv列设置为字符,而无需知道csv导入确定的类型。正确地将结果证明为预期的或所需的可变长度,并将填充的空间转换为零。

例如

data have;
  length a 8 b $7; * dang csv data, someone entered 7 chars for colB;

  a = 12;     b = "MNQ";     output;
  a = 123456; b = "ABCDEFG"; output;
run;

data want;
  set have (rename=(a=csvA b=csvB));

  length a $5 b $6;

  * may transfer, truncate or convert, based on length and type of csv variables;
  * substr used to prevent blank results when cats (number) is too long;
  * instead, the number will be truncated;
  a = substr(cats(csvA),1); 
  b = substr(cats(csvB),1);

  a = translate(right(a),'0',' ');
  b = translate(right(b),'0',' ');
run;

答案 1 :(得分:0)

SUBSTR在左侧。

data test;
   infile cards firstobs=2 dsd;
   length cola $5 colb $6;
   cola = '00000';
   colb = '000000';
   input (a b)($);
   substr(cola,vlength(cola)-length(a)+1)=a;
   substr(colb,vlength(colb)-length(b)+1)=b;
   cards;
colA,colB
12,ABC
445,DEFG
34534,HI
234,JKL
6453,MNOPQR
;;;;
   run;
proc print;
   run;

enter image description here