2

SAS .sas7bdat データ ファイルを読み込んでテキスト形式で出力する SAS スクリプトを作成しようとしています。日付をYYYYMMDD形式で出力したい。日付列の名前がどうなるかわかりません。私のスクリプトは現在:

libname tmplib '~/testdatadir/';
OPTIONS MISSING='00'x;
data tmpdata;
set tmplib.testdatafile;
array flds{*} _NUMERIC_;
do i=1 to dim(flds);
  if missing(flds(i)) then flds(i)=.;
end;
array charflds{*} _CHARACTER_;
do i=1 to dim(charflds);
  if missing(charflds(i)) then charflds(i)=' ';
end;
drop i;
RUN;

PROC EXPORT
  DATA = tmpdata
  OUTFILE = 'testdataoutfile.txt'
  DBMS = TAB REPLACE;
  PUTNAME = YES;
RUN;

すべての日付フィールドを反復処理するか ( NUMERICフィールドとCHARACTERフィールドの場合と同様)、日付であるかどうかをテストする各NUMERICフィールドのチェックを追加するか (その後、形式を変更できます)、またはオプションを追加します。出力日付形式を示す PROC EXPORT。出力ファイルの日付を YYYYMMDD としてフォーマットする他の方法も受け入れられます。

4

2 に答える 2

5

関数を使用してvarfmt、数値変数の形式を見つけることができます。これは、それが日付であるかどうか、つまり、その形式が日付形式であるかどうかを判断するのに役立ちます。技術的には、日付が正しい日付形式ではない可能性があるため、16239 などと表示されますが、16,239 という数字になる可能性があるため、検出が困難です。このメソッドは、データ ブラウザーに日付として表示されるものをすべて検索します。

put次に、との組み合わせを使用inputして、YYYYMMDD 形式にします。

使用するだけの問題の1つputは、デフォルトで文字変数を返すと思うので、日付を保持する新しい文字変数を作成するか、YYYYMMDDを8桁の数字に変換する必要があるため、数字文字列の代わりに 20120501 20120501

例 2では、varfmtデータセット名と変数番号を指定すると、変数の形式が返されることに注意してください。varsこの例では、すべての変数をループする目的で別のテーブルを設定しています。

于 2012-05-01T17:26:15.800 に答える
4

代わりに変数形式を変更することをお勧めします。変数の形式が変更されていない場合、put/input を使用すると、誤った結果が生じる可能性があります。たとえば、put/input を使用して日付を年に変更し、変数の形式を date9 のままにすると、日付は引き続き date9 として読み取られます (基になる値は年になります)。CSV にエクスポートすると、日付が正しくなくなります。

以下は、すべての変数をチェックして日付を分離し、形式を年に変更する単純なマクロです。データセットに含めることができる日付形式を指定し (またはマクロにあるものよりも網羅的なリストを作成し)、それを変更して必要なデータ形式を生成する必要があります。

%macro _toyear(dsin=,dsout=);
/* proc contents will list all variables in the dataset, with formats */
proc contents data=&dsin out=_contents noprint; 
    run;
data _contents; 
    set _contents (where=(format in: ("DATE", "MMDDYY", "MMYY"))); 
    run;

/* use proc sql to create a macro variable with a list of the date variables */
proc sql noprint;
    selet name into: datevars separated by " " from _contents;
    quit;

/* simple error checking, in case there are no date variables */
%let dsid = %sysfunc(open(_contents, is));
%let nlobs = %sysfunc(attrn(&dsid, nlobs));

/* output dataset */
data &dsout;
    set &dsin;
    %if &nlobs ne 0 %then %do; format &datevars year4.; %end;
    run;

/* clean-up */
%let rc = %sysfunc(close(&dsid));
proc datasets nolist; delete _contents;
    run;
%mend _toyear;
于 2012-10-15T12:32:37.193 に答える