编辑3:解决了。为了提高效率,我决定一次遍历每个secid,生成一个“mydat-like”数据集,使用proc export导出它。事实证明,这比使用mydat和所有secid的所有数据然后使用ODS将其输出到不同文件要高效得多。非常感谢你的帮助@Joe和@scott,我的解决方案非常源于你们双方的意见。
编辑2:通过使用ods csv我可以在我的数据集中输出不同的BY组,只要它们按secid排序就可以正常工作。 filenm字段没用,可以删除。我现在的问题是这个解决方案的命名模式。不同的BY组输出为csv11.csv,csv12.csv ...理想情况下,程序应该输出每个secid.csv的文件,例如: 106276.csv。有人知道怎么做吗?
proc sort data=mydat;
by secid;
run;
ods csv
file="/export/csv11.csv"
newfile=bygroup;
proc print data=mydat;
by secid;
run;
ods csv close;
编辑:我正在阅读ODS CSV,正如本页https://communities.sas.com/message/184651所建议的那样,特别是在Cynthia @ sas提供的解决方案中
原帖:继前一个问题(Error in data set firstobs)后,我有一个跟进问题。 如果我有如下数据集,如何将每一行输出到相应的filenm?
Obs secid date impl_volatility filenm
131040 106276 31DEC2003 0.24322 /export/mydat_106276.csv
131040 152120 31DEC2003 0.24142 /export/mydat_152120.csv
这里的情况是我有一个数据集,其中包含许多具有不同secid的记录,我已经使用相应的输出文件生成了filenm字段。在上一个问题中,@ Joe给了我一个解决方案,但我稍微更改了代码。以前,他的解决方案是:
data _null_;
set mydat;
file a filevar=filenm dlm='09'x lrecl=32767;
put (_all_)($);
*or perhaps a more complex put statement - see what proc export generates;
run;
其中a是数据合并产生的1/0数据集,如(以下代码只是一个例子):
data mydat;
merge mydat1(in=a) mydat2(in=b)
by secid;
run;
但是在代码更改后我无法让这个解决方案工作,我不再有数据合并而是proc sql。无论哪种方式,我仍然在数据集中有filenm,这应该是可行的。
提前感谢您的帮助。
答案 0 :(得分:0)
我不知道如何使用ods csv做你想做的事情,如果其他人这样做,我会删除这个
但是,这应该为每个secid创建一个csv,并在列filenm中添加名称 - 如果一个secid有多行
,这将无效 - 如果您不想使用filenm路径,请更改我评论的宏变量的创建,并更改路径以包含.csv
%macro csv_output();
proc sql noprint;
create table secid_dim as
select distinct secid
from mydat
;
quit;
data secid_dim;
set secid_dim;
id_num + 1;
by secid;
run;
proc sql noprint;
select distinct max(id_num)
into :ttl_id
from secid_dim
;
quit;
%do ii = 1 %to &ttl_id;
proc sql noprint;
select distinct secid
into :sec_&ii.
from secid_dim
where id_num = &ii.
;
quit;
proc sql noprint;
select distinct filenm /*Change to secid if you do not want to use filename, but also change your macro variable call to include .csv*/
into :file_&ii.
from mydat
where secid = &&sec_&ii..
;
quit;
proc sql noprint;
create table _tempout_ as
select *
from mydat(drop=filenm)
where secid = &&sec_&ii.
;
quit;
proc export data=_tempout_ outfile="D:/Scripts&&file_&ii.."
dbms=csv replace;
run;
%end;
%mend;
%csv_output;