【发布时间】:2015-04-01 23:20:49
【问题描述】:
我在 SAS 中有一个数据集,其中包含 20 年的数据。我想每年导出到 csv 文件。有什么简单的方法吗?
这是我一年来正在做的事情(这很天真):
过程导出
data=ds (where=(year=2011)) outfile='ds2011.csv' DBMS=CSV 替换;
运行;
非常感谢!
【问题讨论】:
我在 SAS 中有一个数据集,其中包含 20 年的数据。我想每年导出到 csv 文件。有什么简单的方法吗?
这是我一年来正在做的事情(这很天真):
过程导出
data=ds (where=(year=2011)) outfile='ds2011.csv' DBMS=CSV 替换;
运行;
非常感谢!
【问题讨论】:
这将是 SAS/Macro 的理想工作,它允许将文本替换为重复代码。请参阅下面的解决方案(假设日期范围为 1991-2011,更改 %let 语句以适合您的范围),使用宏 %do 循环替换 &dt 的值。 (1991-2011)到您问题中提供的代码中。
%macro date_export;
%let start_date = 1991;
%let end_date = 2011;
%do dt=&start_date %to &end_date;
proc export
data=ds (where=(year=&dt.)) outfile="ds&dt..csv" DBMS=CSV replace;
run;
%end;
%mend date_export;
%date_export
宏
date_export 宏定义在 %macro 和 %mend 语句之间。首先,日期范围被定义为两个宏变量(这可以省略,变量直接插入%do 语句,但为了清楚起见在此说明)。 %do 语句从一个循环开始,dt 宏变量介于 start_date 和 end_date 之间。这可以重写为:
%do dt=1991 %to 2011;
并且省略了最初的两个%let 语句。
循环运行%do 和%end 之间的所有代码,当找到&dt. 时替换dt 的值。
导出代码
需要进行一些细微的更改以确保proc export 在宏循环内正确运行,
首先,最明显的是,我已将年份替换为 &dt.,它将 dt 的值传递到您的代码中。
请注意,当放置在.csv 旁边时,需要一个额外的句点(第一个句点使用dt 解析,只留下单个句点和csv)。
您的问题中的单引号需要替换为双引号,这样宏才能解析。否则,生成的文件将被称为“ds&dt..csv”。
您可以在 SAS 中打开以下选项以帮助进行宏调试和可视化,请查看 SAS 文档了解更多信息:
SYMBOLGEN
MLOGIC
MPRINT
【讨论】:
非宏选项:
您可以在数据步骤中使用file 语句来写出各种类型的文本或分隔文件。使用filevar 选项,您可以为变量的每个值创建一个文件,如下所示。
将yourdata 替换为您的数据集,将write_location 替换为您希望文件所在的位置。
data _null_;
set yourdata;
length fv $ 200;
fv = "\write_location\" || TRIM(put(year,4.)) || ".csv";
file write filevar=fv dsd dlm=',' lrecl=32000 ;
put (_all_) (:);
run;
【讨论】:
put _all_; 产生命名输出(例如“year=2010”),并在输出中包含 fv 的值,以及其他自动变量 _N_ 和 _ERROR_。它也不输出分隔符。避免这种情况的方法是使用:put (_all_) (:);。在这里,SAS 将只打印变量的值,不包括自动变量。我编辑了答案以反映这个更清洁的解决方案。
data 步骤使用与数据集中的变量关联的任何格式写入 csv。如果您在数据集中有一个格式为datetime21.2 的变量,它将在csv 文件中使用datetime21.2 格式写入。
我们没有许可进出口程序,所以我们必须使用另一种方法:
%macro xprtDT(dt=,strt=,nd=);
%do i=&strt %to &nd;
filename myfile "C:\&dt&i..csv";
data _null_;
set &dt;
file myfile;
put
@1 var1 z6.
@7 ' '
@8 var2 z6.
' '
...
@22 varn;
run;
%end;
%mend;
%xprtDT(datadile,1991,2011);
这有点复杂,但可以使用。每个变量都包含三个信息,@是变量的位置,第二是变量的名称,最后是变量的格式。
【讨论】: