我正在尝试创建用户生成的格式,将其保存到库中,然后使用该格式。出于某种原因,当我将格式保存到库时,当我稍后尝试在proc print语句中使用它时它似乎不起作用。
每当我运行此代码时,它都不会抛出错误,但varName的打印输出没有按照我定义的方式进行格式化。
libname fmtLib '/FILEPATH1';
DATA formatData;
INFILE '/FILEPATH2' dsd;
retain fmtname '$fname';
Input start $ label $;
run;
PROC format cntlin= formatData library fmtLib;
run;
proc print data = dataset (obs = 50);
format varName $fname.;
run;
但是,如果我使用此代码:
libname fmtLib '/FILEPATH1';
DATA formatData;
INFILE '/FILEPATH2' dsd;
retain fmtname '$fname';
Input start $ label $;
run;
PROC format cntlin= formatData;
run;
proc print data = dataset (obs = 50);
format varName $fname.;
run;
varName格式正确。我不确定为什么保存或不保存在库中的格式会有所不同。任何帮助表示赞赏。
答案 0 :(得分:3)
确保告诉SAS在哪里可以找到新格式。使用FMTSEARCH
选项。
让我们在两种不同的格式目录中制作相同格式的两个不同版本。
proc format lib=work.formcat1 ;
value status 1='Good' 2='Bad' 3='Ugly';
run;
proc format lib=work.formcat2 ;
value status 1='1 Good' 2='2 Bad' 3='3 Ugly';
run;
因此,如果我将FMTSEARCH选项设置保留为默认设置并设置NOFMTERR
,那么我是否打印样本数据
options nofmterr ;
proc print data=test;
title "%sysfunc(getoption(fmtsearch,keyword))";
format status status. ;
run;
它找不到任何STATUS.
格式,所以我看到原始值。
FMTSEARCH=(WORK LIBRARY)
Obs status
1 1
2 2
3 3
但是,如果我们将FMTSEARCH设置为在使用新的STATUS.
格式
options fmtsearch=(work.formcat1 work.formcat2);
proc print data=test;
title "%sysfunc(getoption(fmtsearch,keyword))";
format status status. ;
run;
它看起来像这样:
FMTSEARCH=(WORK.FORMCAT1 WORK.FORMCAT2)
Obs status
1 Good
2 Bad
3 Ugly
如果我们反转搜索顺序,那么它会找到STATUS.
格式的其他版本,因此输出看起来像这样。
FMTSEARCH=(WORK.FORMCAT2 WORK.FORMCAT1)
Obs status
1 1 Good
2 2 Bad
3 3 Ugly
答案 1 :(得分:0)
在第二个示例中它起作用的原因是您将格式加载到WORK(或可能是USER,但可能是WORK)库中。这自动成为您的格式搜索路径的一部分。
将其加载到工作中很好,或者您可以使用Tom的建议来定义FMTSEARCH。这主要取决于您是在重复会话中使用它还是仅在当前会话中使用它。