引号SAS(+;)过程格式值无效

引号SAS(+;)过程格式值无效,sas,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.)

我仍然被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
弗朗西斯-弗朗西斯
+&装饰-+DECO&
等等

这些名字让我犯了这个错误

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


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

我认为hypen是您提供的示例的问题。也许您可以使用字符替换函数来替换连字符(或其他有问题的字符)添加到其他内容,如空格或下划线

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

因为您的宏使用了太多全局宏变量,所以很难看出问题所在。该错误消息表示您的宏正在生成重复的PROC格式范围。完整的错误消息应该会告诉您哪个范围出错;如果您只看到了这些,我猜您的宏变量中有不止一个会解析为一片空白

在定义PROC格式范围时,使用hypens没有任何限制。我制作了一个小示例来说明:

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格式的更多信息

祝你好运,
Bob

再次感谢CarolinaJay65。我记得你也回答了我之前的问题。这里的问题确实是连字符造成的。但不幸的是,到目前为止,我无法对字符名称进行任何更改。比如,我将连字符改为_,格式将存储FRANCES_FRANCES,这可能会生成另一个字符当我想将格式应用于包含FRANCES-FRANCES而不是FRANCES_FRANCES的表时出现问题。我仍在寻找一种方法,以便SAS可以忽略PROC格式中的连字符。如果要将格式放入变量,可以将该变量值转换回原始值。只需使用与forma相同的公式即可ts/informats,但反过来。那么您使用格式/informats来解码您的值?…1个格式到GOTAN-GOTAN,2个格式到FRANCES-FRANCES,等等?是的,我将使用格式/informats来解码原始表中的值。通过这样做,该表只存储数值,从而减小表的大小。到目前为止,我无法找到一种存储包含连字符的格式/信息的方法。事实上,我认为在这里处理特殊字符没有任何错误。双引号就足够了。我将代码精简了一点以进行测试()。在结果中,数字8被正确地转换为“GOTAN-GOTAN”。并且在处理过程中没有错误。有一件事让我感到困惑,那就是您在
proc format
中使用了do循环。我不知道它是否有效。实际上,
proc format
的实际值语句可以通过宏生成。如果我理解,请纠正我错误的方法。谢谢,我已经成功地用cntLin制作了生成信息和格式的程序。