2012-05-04 58 views
0

我仍然陷入SAS特殊字符治疗。引号SAS(+)PROC FORMAT值| invalue

%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 &
等品牌......

这些名字使我这个错误

“ERROR: This range is repeated, or values overlap:”

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

+0

其实我看不出有什么错在这里处理特殊字符。双引号就足够了。我将代码分解成一小段来测试(http://pastebin.com/vXsE8KWw)。结果,8号被正确翻译成'GOTAN-GOTAN'。处理过程中没有错误。有一件令我困惑的事情是你在'proc format'中使用了do循环。我不知道它是否有效。可以由宏生成'proc format'的实际值语句。如果我理解错误,请纠正我。 –

回答

1

,很难看出问题。该错误信息表明您的宏正在生成与PROC FORMAT重复的范围,完整的错误信息应该告诉您哪个范围出错;如果是你所看到的,我的猜测是你的宏观变量的更多部分解决为空白。

在定义PROC FORMAT范围时,使用hypers没有限制。我做了这个小例子来说明:

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

祝你好运, 鲍勃

+0

谢谢,我已经成功地制作了程序,用cntLin生成信息和格式。 – afiqjohari

1

我认为hypen是您提供的示例的问题。由于宏是使用这么多的全球宏观变量,你可以使用一个字符替换功能TRANSLATE连字符(或其他有问题的字符)到别的东西像一个空格或下划线。

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

再次感谢你CarolinaJay65。我记得你也回答了我以前的问题。确实连字符在这里引起了问题。但不幸的是,就目前而言,我无法改变任何关于角色名称的事情。假设我将**连字符**改为** _ **,FORMAT将存储FRANCES_FRANCES,并且当我想将FORMAT应用于包含FRANCES-FRANCES而不是FRANCES_FRANCES的表格时,这可能会产生另一个问题。 – afiqjohari

+0

我仍在寻找一种方式,以便SAS可以忽略PROC FORMAT中的**连字符**。 – afiqjohari

+0

如果您打算将格式放入变量中,您可以将该变量值转换回原始值。只需使用您用于格式/信息的相同公式,但相反。所以你正在使用你的格式/信息来解码你的值?... 1格式GOTAN-GOTAN,2格式FRANCES-FRANCES等? –