从库中加载用户生成的格式

时间:2018-03-06 18:04:20

标签: sas

我正在尝试创建用户生成的格式,将其保存到库中,然后使用该格式。出于某种原因,当我将格式保存到库时,当我稍后尝试在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格式正确。我不确定为什么保存或不保存在库中的格式会有所不同。任何帮助表示赞赏。

2 个答案:

答案 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.格式

打印时搜索FORMCAT1然后再搜索FORMCAT2
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。这主要取决于您是在重复会话中使用它还是仅在当前会话中使用它。