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

问题描述 投票:-1回答:2

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

sas
2个回答
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

但是,当我们使用新的qazxsw poi格式打印时,我们将FMTSEARCH设置为搜索FOR CAT 1,然后设置FORMCAT2

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.

0
投票

它在第二个示例中起作用的原因是您将格式加载到WORK(或可能是USER,但可能是WORK)库中。这自动成为您的格式搜索路径的一部分。

加载到工作中很好,或者您可以使用Tom的建议来定义FMTSEARCH。这主要取决于您是在重复会话中使用它还是仅在当前会话中执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.