我仍然坚持使用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的最佳方法(&,%, - ,',“)。
答案 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的更多信息。
祝你好运, 鲍勃