引号SAS(+)PROC FORMAT值| invalue

时间:2012-05-04 18:17:10

标签: sas

我仍然坚持使用SAS特殊字符处理。

 %macro mFormat();
    %do i=1 %to &numVar. ;
        proc format library = work ;
            invalue $ inf&&nomVar&i..s
            %do j=1 %to &&numMod&i.;
                "%superq(tb&i.mod&j.)" = &j.
            %end;
            ;
        run;
        proc format library = work ;
            value f&&nomVar&i..s
            %do k=1 %to &&numMod&i.;
                &k. = "%superq(tb&i.mod&k.)"
            %end;
            ;
        run;
    %end;
%mend mFormat;
%mFormat();

如您所见,程序假设为每个变量创建格式和信息。我唯一的问题是当变量名称解析为包含

的Brand时

GOTAN-GOTAN
FRANCES-FRANCES
+&安培; DECO- + DECO&安培;
等...

这些名称引发了我的错误

  

“错误:重复此范围,或重叠值:”

我希望我能强迫SAS读取这些名字。或者,这可能不是为包含这些字符的变量生成FORMATS和INFORMATS的最佳方法(&,%, - ,',“)。

2 个答案:

答案 0 :(得分:1)

我认为这是你提供的样品的问题。也许你可以使用字符替换函数将TRANSLATE连字符(或其他问题字符)用于其他类似空格或下划线的内容。

%Let Test=One-Two;
 %Put &test;
%Let Test=%sysfunc(translate(&test,%str(_),%str(-)));
 %Put &test;

答案 1 :(得分:1)

因为您的宏使用了这么多全局宏变量,所以很难看到问题所在。该错误消息表明您的宏正在生成PROC FORMAT的重复范围。完整的错误消息应该告诉您哪个范围出错;如果这就是你所看到的,我的猜测是你的宏变量会被解析为空白。

在定义PROC FORMAT范围时使用超量没有限制。我编写了这个小例子来说明:

proc format library = work ;
   invalue infs
     'GOTAN-GOTAN'     = 1
     'FRANCES-FRANCES' = 2
     '+&DECO-+DECO&'   = 3;
   value fs
     1 = 'GOTAN-GOTAN'
     2 = 'FRANCES-FRANCES'
     3 = '+&DECO-+DECO&';
run;
data a;
   test = 'FRANCES-FRANCES';
   in_test = input(test,infs.);
   put test= in_test= in_test= fs.;
run;

虽然您可能会找到解决宏问题的技巧,但我建议您抛弃它并使用PROC FORMAT的CNTLIN选项来使用数据集来创建自定义格式和信息。这肯定会使事情更容易维护,也可能有助于为您的项目创建一些有用的元数据。这是一个创建与上面相同的格式和信息的简单示例:

data fmt_defs;
   length fmtname start label $32 type $1;

   fmtname = 'INFS';
   type = 'I';
   start = 'GOTAN-GOTAN';     label = '1'; output;
   start = 'FRANCES-FRANCES'; label = '2'; output;
   start = '+&DECO-+DECO&';   label = '3'; output;

   fmtname = 'FS';
   type = 'N';
   start = '1';  label='GOTAN-GOTAN';     output;
   start = '2';  label='FRANCES-FRANCES'; output;
   start = '3';  label='+&DECO-+DECO&';   output;
run;
proc format library = work cntLin=fmt_defs;
run;

您可以在在线文档中找到有关PROC FORMAT的更多信息。

祝你好运, 鲍勃