1

SAS で問題が発生しています。個々のtxtファイルに毎月の気象データがたくさんあります。私の現在の目標は、それらを読み取り、それぞれに個別のデータセットを作成することです。または、このステップをスキップして、これらすべてのデータ セットを別のデータ セットに日時でマージするという最終目標に近づくことができることがわかりました。以下は、問題の私の試みでした。ファイル名を繰り返し処理し、一致するデータセット名を作成するマクロが機能すると思っていましたが、明らかにそうではありません。また、より効率的にするために、if/else if ステートメントを DO ループに置き換えることができると思いますが、わかりませんでした。助けていただければ幸いです。

%macro loop; 
%do i = 11 %to 13; 
%do j = 01 %to 12; 
    %let year = i; 
    %let month = j;
    data _&year&month ; 
        infile "&path\hr_pit_&year..&month..txt" firstobs=27;  
        length Time $ 4 Month $ 3 Day $ 2 Year $ 4 temp 3; 
        input time $ Month $ 10-13 Day Year temp 32-34; 
        Date = Day||Month||Year;
        if time = '12AM' then time = 2400;
        else if time = '1AM ' then time = 100; 
        else if time = '2AM ' then time = 200; 
        else if time = '3AM ' then time = 300; 
        else if time = '4AM ' then time = 400; 
        else if time = '5AM ' then time = 500; 
        else if time = '6AM ' then time = 600; 
        else if time = '7AM ' then time = 700; 
        else if time = '8AM ' then time = 800; 
        else if time = '9AM ' then time = 900; 
        else if time = '10AM' then time = 1000;
        else if time = '11AM' then time = 1100; 
        else if time = '12PM' then time = 1200;
        else if time = '1PM ' then time = 1300;
        else if time = '2PM ' then time = 1400;
        else if time = '3PM ' then time = 1500;
        else if time = '4PM ' then time = 1600;
        else if time = '5PM ' then time = 1700;
        else if time = '6PM ' then time = 1800;
        else if time = '7PM ' then time = 1900;
        else if time = '8PM ' then time = 2000;
        else if time = '9PM ' then time = 2100;
        else if time = '10PM' then time = 2200;
        else if time = '11PM' then time = 2300;
        _time = input(time,4.);
        time = _time; 
        drop month day year; 
    run; 
%end; 
%end; 
%mend; 

%loop; run: 

一般的な txt ファイルは次のようになります。

以下は、同じ形状と形式の txt ファイルのリストです: http://www.erh.noaa.gov/pbz/hourlyclimate.htm

4

2 に答える 2

2

最初の修正:

%let year = &i; 
%let month = %sysfunc(putn(&j, z2.));

マクロ変数を使用し、月に先行ゼロを追加します。残りの変更は、AM/PM を処理するだけです。また、日付は数値になりました。

完全なコード:

%macro loop; 
%do i = 11 %to 13; 
%do j = 1 %to 12; 
    %let year = &i; 
    %let month = %sysfunc(putn(&j, z2.));
    data _&year&month ;
        length Date 5 _Time $4 Time 8 Month $3 Day $2 Year $4 temp 3; 
          format Date DATE9.; 
        infile "&path\hr_pit_&year..&month..txt" firstobs=27;  

    input _time $ Month $ 10-13 Day Year temp 32-34; 
    _time = right(_time);
    Date = input(Day||Month||Year, date9.);
    if _time = '12AM' or (_time ne '12PM' and index(_time, 'PM') > 1 )
            then time=input(_time, 2.) + 12;
    else time=input(_time, 2.);
    time = time * 100;
    drop month day year;
run; 
     /* gather all data in one table */
    proc append base=work.all_data data=work._&year&month;
    run;
%end; 
%end; 
%mend; 


proc sql;
drop table work.all_data;
quit;
%let path=E:;
%loop; 
于 2013-10-09T08:53:02.090 に答える
0

最善の答えは、それらすべてを 1 つのデータセットに読み込んでから、そこから最終的なデータセットにマージすることです。100-2400 (および一貫性のない 2400、それを行っている場合は実際には 000 である必要があります) ではなく、リアルタイムの値を使用することで、より良いサービスが提供されると思いますinput

とにかく、テキストファイルを次のように読むと:

data my_text_files;
infile "c:\mydirectory\*.txt" lrecl=whatever eov=eovmark;
*firstobs=27 is only respected for the first file - so we have to track with eovmark;
if eovmark then do;
  eovmark=0;
  linecounter=0;
end;
linecounter+1;
if linecounter ge 27 then do;
  input (input statement);
  (any other code you want to execute here);
  output;
end;
run;

次に、(なんでも)マージします。ファイル名に関する情報が必要な場合は、ステートメントfilenameでオプションを使用してアクセスできます。infile

于 2013-10-09T13:47:31.413 に答える