我一直在用一些C函数扩展SAS字符串处理,例如最长的常见子字符串算法。 proc FCMP功能很容易变得非常低效。
在Visual Studio中编写算法后,proc proto中的嵌入式C编译器似乎没有产生我期望的结果。我认为我已经验证的一件事是传递给C函数的字符串似乎是空格填充到大约100个字符的长度。
在我继续编写更多代码以推断字符串应该结束的位置之前,我想知道是否有人知道其他方法,或者一般可以分享有关为SAS编写C函数的想法吗?
以下是一些代码
/* C functions*/
proc proto package=sasuser.funcs.sfuncs;
/* A string length function */
int cslen(const char *s);
externc cslen;
int cslen(const char *s)
{
int i=0;
while (s[i++]!=0){}
return i-1;
}
externcend;
/* A char function */
int cschar(const char *s,const int pos);
externc cschar;
int cschar(const char *s,const int pos)
{
return s[pos];
}
externcend;
run;
option cmplib=sasuser.funcs;
/* SAS wrappers */
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(s);
return(val);
endsub;
function schar(s $,pos);
val=cschar(s,pos);
return(val);
endsub;
quit;
使用
测试funcs/* Tests */
data _null_;
length str $6.;
str="foobar";
len=slen(str);
firstchar=schar(str,0);
lastchar=schar(str,5);
shouldbenull=schar(str,6);
put _all_;
run;
给出
str=foobar len=91 firstchar=102 lastchar=114 shouldbenull=32 _ERROR_=0 _N_=1
编辑:我们原来,你可以通过简单地修剪包装中的字符串来解决这个问题,例如:
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(trim(s));
return(val);
endsub;
quit;
答案 0 :(得分:3)
我会联系SAS技术支持(support@sas.com)获取有关PROC PROTO的帮助以及SAS如何将字符串传递到C例程。
还有其他方法可以访问用C编写的例程。一种是使用CALL MODULE,MODULEN函数或MODULEC函数。这些例程能够调用存储在.dll(或Unix上的.so)中的函数。 Windows CALL MODULE文档的链接在这里:
http://support.sas.com/documentation/cdl/en/hostwin/61924/HTML/default/win-func-module.htm
UNIX CALL MODULE文档的链接在这里:
http://support.sas.com/documentation/cdl/en/hostunx/61879/HTML/default/unx-func-module.htm
另一个选择是许可SAS / TOOLKIT。 SAS / TOOLKIT允许您以C语言编写函数,PROC,格式,信息和引擎,以及可以从SAS使用的其他语言。这是一个包含有关SAS / TOOLKIT的信息的页面: