我在SAS中有一个数据集,其中包含20年的数据。我想每年导出到csv文件。有没有简单的方法呢?
这是我现在正在做的一年(这是天真的):
proc export
data = ds(where =(year = 2011))outfile ='ds2011.csv'DBMS = CSV替换;
运行;
非常感谢!
答案 0 :(得分:7)
非宏选项:
您可以在数据步骤中使用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;
答案 1 :(得分:2)
这对于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
答案 2 :(得分:0)
我们没有许可进出口程序,所以我们必须使用另一种方法:
%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);
这有点复杂,但可以使用。在变量second的位置是变量的名称后,每个变量包含三元组的信息,最后是变量的格式。