检查SAS Proc Format中字符串的长度

时间:2016-12-16 11:13:23

标签: validation sas format proc

我想编写一个PROC FORMAT来检查作为唯一标识符的变量中的错误。变量是一个长度为16的字符串,它通常有许多尾随零,如下所示:

0000001234567890

我希望PROC向日志输出错误,例如,如果变量为null或者sting的长度与16不同。可以在同一个proc中完成,而不必通过函数如length()?

我想要获得的是:

proc format;
value $ id_error
     ' ' = _ERROR_
     *length ne 16 = _ERROR_;
     *other errors* = _ERROR_;
     other = 'OK';
run;

使用单一proc格式可以使用与上述相同的东西吗?

1 个答案:

答案 0 :(得分:0)

Reeza建议使用PROC FCMP是我认为正确的道路。如果没有它,你无法真正检查长度。

文档here中对此进行了介绍。基本结构是,编写一个fcmp函数,它接受一个字符值作为输入(对于一个字符格式)并返回一个字符值,然后在格式中调用那个没有参数的fcmp函数;格式的输入值将自动提供。

在9.3 +:

data have;
length cardno $32;
input cardno;
datalines;
1234567890123456
0000153456789152
0000000000000000
1111111111111111
9999999999999999
0123456
01234567897456
0123154654564897987445
;;;;
run;

proc fcmp outlib=work.funcs.fmts;
  function check16fmt(charval $) $;
    length retval $16;
    if length(charval) = 16 then retval='VALID VALUE';
    else retval='_ERROR_';
    return(retval);
  endsub;
run;

options cmplib=work.funcs;

proc format;
  value $chk16f
  low-high = [check16fmt()];
quit;

data want;
  set have;
  format cardno $chk16f.;
run;