首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sas数据格式

sas数据格式
EN

Stack Overflow用户
提问于 2012-05-01 17:15:19
回答 2查看 2.4K关注 0票数 2

我正在尝试编写一个SAS脚本,它将简单地读取一个SAS .sas7bdat数据文件并以文本格式输出它。我希望日期以YYYYMMDD格式输出。我不知道日期栏的名字是什么。我的脚本目前是:

代码语言:javascript
复制
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;

我希望迭代所有日期字段(就像我对数字字段和字符字段所做的那样),或者添加对每个数字字段的检查,测试它是否是日期(然后我可以更改格式),或者添加一个选项到PROC导出以指示输出日期格式。将输出文件的日期格式化为YYYYMMDD的任何其他方法也是可以接受的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-01 17:26:15

您可以使用varfmt函数查找数值变量的格式,这可以帮助您确定它是否是日期,即它的格式是否为日期格式。从技术上讲,您可能有一个日期格式不正确的日期,所以它只是显示为16239或什么,但这些很难检测,因为它也可能是数字16,239。此方法将在数据浏览器中找到任何显示为日期的内容。

然后使用putinput的一些组合将其转换为YYYYMMDD格式。

使用put的一个问题是,我认为默认情况下它将返回一个字符变量,所以您需要创建一个新的字符变量来保存日期,或者将YYYYMMDD转换回8位数字,所以数字20120501而不是字符串20120501

对于例2,您应该注意到,varfmt返回给定数据集名称和变量号的变量的格式。在这个示例中,他们设置了一个单独的vars表,其目的是循环遍历所有变量。

票数 5
EN

Stack Overflow用户

发布于 2012-10-15 12:32:37

我建议改为更改可变格式。当变量格式未更改时,使用put/input可能会导致不正确的结果。例如,如果使用put/input将日期更改为年份,但将变量格式保留为date9,则日期仍将被读取为date9 (基础值将为年份)。如果您导出到CSV,日期将是不正确的。

这里有一个简单的宏,它将检查所有变量并隔离日期,以便将它们的格式修改为年份。您需要指定数据集中的日期格式(或创建比宏更详尽的列表),并对其进行修改以生成所需的数据格式。

代码语言:javascript
复制
%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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10401471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档