我正在尝试编写一个简单读取SAS .sas7bdat数据文件并以文本格式输出的SAS脚本。我希望日期以YYYYMMDD格式输出。我不知道日期列的名称是什么。我的脚本目前是:
libname tmplib '~/testdatadir/';
OPTIONS MISSING='00'x;
data tmpdata;
set tmplib.testdatafile;
array flds{*} _NUMERIC_;
do i=1 to dim(flds);
if missing(flds(i)) then flds(i)=.;
end;
array charflds{*} _CHARACTER_;
do i=1 to dim(charflds);
if missing(charflds(i)) then charflds(i)=' ';
end;
drop i;
RUN;
PROC EXPORT
DATA = tmpdata
OUTFILE = 'testdataoutfile.txt'
DBMS = TAB REPLACE;
PUTNAME = YES;
RUN;
我想要遍历所有日期字段(就像我使用 NUMERIC 字段和 CHARACTER 字段一样),或者为每个 NUMERIC <添加一个检查/ em>现场测试是否是日期(然后我可以更改格式),或者向PROC EXPORT添加一个选项以指示输出日期格式。任何其他方法来获取输出文件的日期格式为YYYYMMDD也是可以接受的。
答案 0 :(得分:5)
您可以使用varfmt
功能查找数字变量的格式,这可以帮助您确定它是否为日期,即其格式是否为日期格式。从技术上讲,你可能有一个日期不是正确的日期格式,所以它只显示为16239或其他东西,但这些很难被发现,因为它也可能只是数字16,239。此方法将在数据浏览器中找到任何显示为日期的内容。
然后使用put
和input
的某种组合将其转换为YYYYMMDD格式。
使用put
的一个问题是我认为默认情况下会返回一个字符变量,所以你需要创建一个新的字符变量来保存日期,或者将YYYYMMDD转换回一个8位数字,所以数字20120501而不是字符串20120501
。
对于example 2,您应该注意varfmt
返回给定数据集名称和变量编号的变量格式。在示例中,他们设置了一个单独的vars
表,其目的是遍历所有变量。
答案 1 :(得分:4)
我建议改变变量格式。当变量格式未更改时,使用put / input可能会导致错误的结果。例如,如果使用put / input将日期更改为年份,但将变量格式保留为date9,则日期仍将读取为date9(基础值将为year)。如果导出为CSV,则日期将不正确。
这是一个简单的宏,它将检查所有变量并隔离日期,以便将其格式修改为年份。您需要指定数据集中的日期格式(或创建比宏中更详尽的列表),并修改它以生成所需的数据格式。
%macro _toyear(dsin=,dsout=);
/* proc contents will list all variables in the dataset, with formats */
proc contents data=&dsin out=_contents noprint;
run;
data _contents;
set _contents (where=(format in: ("DATE", "MMDDYY", "MMYY")));
run;
/* use proc sql to create a macro variable with a list of the date variables */
proc sql noprint;
selet name into: datevars separated by " " from _contents;
quit;
/* simple error checking, in case there are no date variables */
%let dsid = %sysfunc(open(_contents, is));
%let nlobs = %sysfunc(attrn(&dsid, nlobs));
/* output dataset */
data &dsout;
set &dsin;
%if &nlobs ne 0 %then %do; format &datevars year4.; %end;
run;
/* clean-up */
%let rc = %sysfunc(close(&dsid));
proc datasets nolist; delete _contents;
run;
%mend _toyear;