如何解决访问所有可访问的SAS格式?
假设我们的项目有数百个彼此调用的SAS脚本。它还包括大量的SAS格式,主要用于具有某些特征的列,例如格式File "/hdfs/data_06/yarn/nm/usercache/<alias>/appcache/application_1583989737267_1123855/container_e59_1583989737267_1123855_01_000001/py4j-0.9-src.zip/py4j/java_gateway.py",line 746,in send_command
raise Py4JError("Answer from Java side is empty")
Py4JError: Answer from Java side is empty
ERROR:py4j.java_gateway:Error while sending or receiving.
Traceback (most recent call last):File "/hdfs/data_10/yarn/nm/usercache/<alias>/appcache/application_1583989737267_1123601/container_e59_1583989737267_1123601_01_000001/py4j-0.9-src.zip/py4j/java_gateway.py",line 626,in send_command
File "/hdfs/data_10/yarn/nm/usercache/<alias>/appcache/application_1583989737267_1123601/container_e59_1583989737267_1123601_01_000001/py4j-0.9-src.zip/py4j/java_gateway.py",line 749,in send_command
File "/usr/lib64/python2.7/logging/__init__.py",line 1182,in exception
self.error(msg,*args,**kwargs)
File "/usr/lib64/python2.7/logging/__init__.py",line 1175,in error
self._log(ERROR,msg,args,line 1268,in _log
self.handle(record)
File "/usr/lib64/python2.7/logging/__init__.py",line 1278,in handle
self.callHandlers(record)
File "/usr/lib64/python2.7/logging/__init__.py",line 1318,in callHandlers
hdlr.handle(record)
File "/usr/lib64/python2.7/logging/__init__.py",in handle
self.emit(record)
File "/usr/lib64/python2.7/logging/__init__.py",line 879,in emit
self.handleError(record)
File "/usr/lib64/python2.7/logging/__init__.py",line 802,in handleError
None,sys.stderr)
File "/usr/lib64/python2.7/traceback.py",line 125,in print_exception
print_tb(tb,limit,file)
File "/usr/lib64/python2.7/traceback.py",line 69,in print_tb
line = linecache.getline(filename,lineno,f.f_globals)
File "/usr/lib64/python2.7/linecache.py",line 14,in getline
lines = getlines(filename,module_globals)
File "/usr/lib64/python2.7/linecache.py",line 40,in getlines
return updatecache(filename,line 128,in updatecache
lines = fp.readlines()
RuntimeError: maximum recursion depth exceeded while calling a Python object
将chip_col
替换为1
,red
显示为2
。
假设我使用SAS-explorer打开了一个给定的表,现在我看到一个表,该表的列以数字而不是颜色作为文本。在这种情况下,我将右键单击列标题以打开列属性并浏览最合适的格式。
然后我的问题是双重的:首先,当调用带有所有可能格式的下拉菜单时,显示(自定义)格式的所有可用选择的SAS弹出窗口会花费很多时间。其次,我看不到实际的格式定义,只是看不到格式名称缩写,对我而言并不太有用。
我的问题:如何从SAS中以编程方式访问完整的格式信息?
解决方法
您可以使用proc sql显示的字典表来获取格式(以及数据集等其他内容)的完整列表。试试这个:
proc format library=work;
value sex 0 = "F"
1 = "M";
run;
proc sql;
create table blah as
select *
from dictionary.formats
where libname = "WORK"
;
quit;
如果从上面的SQL语句中删除where
子句,它将列出所有格式的详细信息。
您可以使用proc format
在这样的目录中显示格式:
* add your library where I have "WORK";
proc format library = WORK FMTLIB CNTLOUT = work.x;
run;
您可以使用CNTLOUT将信息保存到表中。
, VIEWTABLE
具有引发对话框的功能,该对话框为Column Attributes...
窗口中显示的列定义VIEWTABLE
。从列标题上下文菜单中,或者通过双击列标题,将弹出对话框。
如果您选择Format:
字段省略号,则会弹出另一个对话框,用于从选择对话框中选择格式。作为填充选择对话框的一部分,VIEWTABLE
的内部部件将生成SAS代码,并将其包含在选项/SOURCE2
中。当有许多自定义格式时,这可能会导致大量LOG
窗口输出,这可能会导致永久使用体验。 /SOURCE2
由于是可视内部编码器的一部分而无法消除。
Viewtable内部代码生成器用于填充格式选择器:
40218 proc delete data=work._qwffmt;
40219 run;
40220 proc sql;
40221 create table work._qwffmt as select fmtname,libname,memname from dictionary.formats where
40221! source='C' and fmttype='F' order by libname,memname;
40222 quit;
40223 filename _sascode temp;
40224 data _null_;
40225 file _sascode;
40226 put 'data work._fmtdesc;';
40227 put ' length fmtname $32 label $3 type $1 start $16 end $16 min max default 3;';
40228 put ' stop;';
40229 put ' fmtname=" "; label=" "; type=" "; min=0; max=0; start=" "; end=" "; default=0;';
40230 put ' run;';
40231 run;
40232 data _null_;
40233 set work._qwffmt;
40234 by libname memname;
40235 file _sascode mod;
40236 if first.memname then do;
40237 length libmem $41;
40238 libmem=cats(libname,'.',memname);
40239 put 'proc format lib=' libmem 'cntlout=_temp(keep=fmtname start end label min max default
40239! type) noprint;';
40240 put 'select';
40241 end;
40242 put fmtname;
40243 if last.memname then do;
40244 put '; run;';
40245 put 'proc append base=work._fmtdesc data=_temp force; run;';
40246 put 'proc delete data=_temp; run;';
40247 end;
40248 run;
40249 %include _sascode/source2;
40250 +data work._fmtdesc;
40251 + length fmtname $32 label $3 type $1 start $16 end $16 min max default 3;
40252 + stop;
40253 + fmtname=" "; label=" "; type=" "; min=0; max=0; start=" "; end=" "; default=0;
40254 + run;
40255 +proc format lib=WORK.FORMATS cntlout=_temp(keep=fmtname start end label min max default
40255!+type) noprint;
40256 +select
40257 +_BABB /* if many thousands,log window can slow things a lot */
40258 +_BAAB
40259 +_ABAB
40260 +_BBAB
40261 +_BAAA
40262 +_ABAA
40263 +_BABA
40264 +_AABA
40265 +_BBAA
40266 +_ABBA
40267 +_BBBA
40268 +_AAAA
40269 +_AAAB
40270 +_AABB
40271 +_ABBB
40272 +_BBBB
40273 +;
40273!+ run;
40274 +proc append base=work._fmtdesc data=_temp force; run;
40275 +proc delete data=_temp; run;
40276 run;
40277 filename _sascode clear;
避免此会话破坏日志输出的唯一方法是在打开VIEWTABLE
之前将日志输出发送到临时文件,这通常是一个不合理的命题。
这是创建10,000种自定义格式的示例代码,在我的系统上,填充列表并在通过Format
对话框窗口省略号引起的Column Attributes
对话框中显示列表大约需要4秒钟。随着自定义格式数量的增加,时间延迟会线性地恶化。
proc printto log=log;
run;
proc datasets noprint lib=work;
delete formats / mt=catalog;
run;
%let N_FORMATS = 10000;
%let ROOT4 = %sysevalf((&N_FORMATS-1) ** 0.25,FLOOR);
%put &=ROOT4;
data cntlin;
do l1 = 65 to 65+&ROOT4;
c1 = byte(l1);
do l2 = 65 to 65+&ROOT4;
c2 = byte(l2);
do l3 = 65 to 65+&ROOT4;
c3 = byte(l3);
do l4 = 65 to 65+&ROOT4;
c4 = byte(l4);
fmtname = '_' || cats(of c:);
start = 0; label = 'No '; output;
start = 1; label = 'Yes'; output;
end;
end;
end;
end;
keep fmtname start label;
run;
proc sql noprint;
select count(DISTINCT fmtname) into :count trimmed from cntlin;
%put &=count different custom formats;
options nonotes;
proc format cntlin = cntlin;
run;
options notes;
data have;
call streaminit(123);
array v v1-v200;
do row = 1 to 150;
do over v; v = rand('integer',1); end;
output;
end;
run;
options nonotes nosource2;
filename dump temp;
proc printto log=dump;
run;
dm 'vt have' viewtable;
,
听起来像您用来查看数据的任何GUI工具(也许是VIEWTABLE?)都没有提供格式列表的好方法。在那种情况下,我会尽量避免这样做。因此,通常在创建数据集时应附加格式。因此,如果您以这种方式定义数据集:
doks.digitalocean.com/node-pool-id
然后在查看器中打开它时,您将看到:
如果您想让一个方法同时看到代码和解码,请检查此宏以创建新的格式定义,其中将代码包含在解码中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。