【问题标题】:SAS: Limiting variables in PROC EXPORTSAS:在 PROC EXPORT 中限制变量
【发布时间】:2012-07-30 18:33:27
【问题描述】:

我有一个 PROC EXPORT 问题,想知道您是否可以回答。

我有一个 SAS 数据集,其中包含 800 多个变量和超过 20 万个观察值,我正在尝试将变量的子集导出到 CSV 文件(即我需要所有记录;我只是不想要所有 800 多个变量)。我总是可以创建一个临时数据集“保留”我需要的字段并在该临时数据集上运行 EXPORT,但我试图避免额外的步骤,因为我有大量记录。

为了证明这一点,请考虑一个包含三个变量的数据集,名为 x、y 和 z。但是,我希望通过 PROC EXPORT 生成的文本文件只包含 x 和 y。我对以下解决方案的尝试并不完全奏效。

SAS 代码

当我运行以下代码时,我并没有得到我真正需要的东西。如果您运行此代码并查看生成的文本文件,它在每一行的末尾都有一个逗号,并且标题包含数据集中的所有变量。此外,我在日志中收到了一些我不应该收到的消息。

data ds1;
      do x = 1 to 100;
            y = x * x;
            z = x * x * x;
            output;
      end;
run;

proc export data=ds1(keep=x y)
      file='c:\test.csv'
      dbms=csv
      replace;
quit;

这是生成的文本文件的前几行(“C:\test.csv”)

x,y,z
1,1,
2,4,
3,9,
4,16,

SAS 日志

9343  proc export data=ds1(keep=x y)
9344      file='c:\test.csv'
9345      dbms=csv
9346      replace;
9347  quit;

9348   /**********************************************************************
9349   *   PRODUCT:   SAS
9350   *   VERSION:   9.2
9351   *   CREATOR:   External File Interface
9352   *   DATE:      30JUL12
9353   *   DESC:      Generated SAS Datastep Code
9354   *   TEMPLATE SOURCE:  (None Specified.)
9355   ***********************************************************************/
9356      data _null_;
9357      %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
9358      %let _EFIREC_ = 0;     /* clear export record count macro variable */
9359      file 'c:\test.csv' delimiter=',' DSD DROPOVER lrecl=32767;
9360      if _n_ = 1 then        /* write column names or labels */
9361       do;
9362         put
9363            "x"
9364         ','
9365            "y"
9366         ','
9367            "z"
9368         ;
9369       end;
9370     set  DS1(keep=x y)   end=EFIEOD;
9371         format x best12. ;
9372         format y best12. ;
9373         format z best12. ;
9374       do;
9375         EFIOUT + 1;
9376         put x @;
9377         put y @;
9378         put z ;
9379         ;
9380       end;
9381      if _ERROR_ then call symputx('_EFIERR_',1);  /* set ERROR detection macro variable */
9382      if EFIEOD then call symputx('_EFIREC_',EFIOUT);
9383      run;

NOTE: Variable z is uninitialized.
NOTE: The file 'c:\test.csv' is:
      Filename=c:\test.csv,
      RECFM=V,LRECL=32767,File Size (bytes)=0,
      Last Modified=30Jul2012:12:05:02,
      Create Time=30Jul2012:12:05:02

NOTE: 101 records were written to the file 'c:\test.csv'.
      The minimum record length was 4.
      The maximum record length was 10.
NOTE: There were 100 observations read from the data set WORK.DS1.
NOTE: DATA statement used (Total process time):
      real time           0.04 seconds
      cpu time            0.01 seconds


100 records created in c:\test.csv from DS1.


NOTE: "c:\test.csv" file was successfully created.
NOTE: PROCEDURE EXPORT used (Total process time):
      real time           0.12 seconds
      cpu time            0.06 seconds

有什么想法可以解决这个问题吗?我在 Windows 7 上运行 SAS 9.2。

任何帮助将不胜感激。谢谢。

  • 卡提克

【问题讨论】:

  • 我意识到我可以使用 "data null; set ds1; file 'c:\test.csv' dlm=','; put x y; run;"让它发挥作用。 PROC 导出似乎很有吸引力,因为我明天可能需要导出到 excel 工作簿而不是 CSV 文件,然后“数据步骤”选项将不起作用。
  • 我不知道这是否有效,所以我将其作为评论发布。您可以只使用数据视图来创建所需的子集,然后将其导出吗?我的意思是,您可以导出视图吗?我不确定……
  • 这就像一个魅力!我会将其发布为解决方案。谢谢。
  • 请注意,数据集选项在导出到分隔文件(如 csv)时不起作用,但在导出到 Excel 时起作用。

标签: sas


【解决方案1】:

根据 Itzy 对我的问题的评论,这是答案,这正是我所需要的。

proc sql;
    create view vw_ds1 as 
        select x, y from ds1;
quit;

proc export data=vw_ds1
    file='c:\test.csv'
    dbms=csv
    replace;
quit;

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多