使用ODS将数据集写入具有特定名称的不同.csv

时间:2014-01-14 12:00:58

标签: csv sas

编辑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,这应该是可行的。

提前感谢您的帮助。

1 个答案:

答案 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;