5

PROC EXPORT に関する質問がありますが、お答えいただけないでしょうか。

800 以上の変数と 20 万を超える観測値を含む SAS データセットがあり、変数のサブセットを CSV ファイルにエクスポートしようとしています (つまり、すべてのレコードが必要です。800 以上の変数すべてが必要なわけではありません)。必要なフィールドだけを「KEEP」する一時データセットをいつでも作成し、その一時データセットで EXPORT を実行できますが、多数のレコードがあるため、追加の手順を避けようとしています。

これを実証するために、x、y、z という名前の 3 つの変数を持つデータセットを考えてみましょう。しかし、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 を実行しています。

どんな助けでも大歓迎です。ありがとう。

  • カーシック
4

1 に答える 1

7

私の質問に対する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;

助けてくれてありがとう!

于 2012-07-30T20:05:24.363 に答える