0

我仍然坚持使用 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();

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

GOTAN-GOTAN
FRANCES-FRANCES
+&DECO-+DECO&
等...

这些名称导致我出现此错误

“错误:此范围重复,或值重叠:”</p>

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

4

2 回答 2

1

我认为炒作是您提供的样本的问题。也许您可以使用字符替换功能将字符(或其他问题字符)转换为空格或下划线等其他内容。

%Let Test=One-Two;
 %Put &test;
%Let Test=%sysfunc(translate(&test,%str(_),%str(-)));
 %Put &test;
于 2012-05-04T19:17:53.077 回答
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 的更多信息。

祝你好运,鲍勃

于 2012-05-06T19:22:38.210 回答