2012-05-01 26 views
1

私は、SAS .sas7bdatデータファイルを読み込んでテキスト形式で出力するだけのSASスクリプトを作成しようとしています。日付をYYYYMMDD形式で出力したい。私は日付の列の名前がどうなるかわかりません。私のスクリプトは、現在、次のとおりです。私はどちらか(私はNUMERICフィールドとCHARACTERフィールドと同じように)すべての日付フィールドを反復処理したい、または各NUMERICフィールドテストするかどうかのチェックを追加しますsasの日付形式

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; 

それは日付です(フォーマットを変更することもできます)。またはPROC EXPORTに出力日付フォーマットを示すオプションを追加します。出力ファイルの日付をYYYYMMDDの形式にする他の方法も同様です。

+0

あなたのデータに変数が日付であることを示す何かがありますか?それはすでに日付としてフォーマットされていますか?それが日付であることを示す名前の中に何かがありますか? –

答えて

5

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

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

putを使用した場合の1つの問題は、デフォルトでは文字変数を返すと思いますので、日付を保持するために新しい文字変数を作成するか、YYYYMMDDを8桁に戻す必要があります数字のため、文字列20120501ではなく数字20120501になります。

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

+3

VARFMT関数は、SASコンポーネント言語(SCL)で使用されるため、構文が複雑になります。 VFORMAT関数はデータステップ内で同じタスクを実行しますが、ここではもっと簡単です。しかし、返される書式名が多くの日付書式の1つであることを確認する作業はまだあります。 – Longfish

3

代わりに可変形式を変更することをお勧めします。 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;