2016-06-14 7 views
1

テキストファイルを取り込み、その内部のマクロ参照を置き換えて1つの出力ファイルに追加するプログラムを作成しようとしています。マクロ参照は、データセット内の観測を反復するときに生成されます。データセット内のすべての観測でファイルを1行ずつ読み込みます。

ソーステーブルの各観測について、テキストファイル全体を読み込もうとしています。 infileステートメントにend=オプションを使用していることに関連する暗黙的なstop命令があります。このステートメントは、各レコードが繰り返し処理されないようにしています。私は例の下に、テンプレートやコードを簡素化しました

:ここ

は私が移入しようとしているテンプレートです:

INSERT INTO some_table (name,age)  
VALUES (&name,&age); 
ここ

は、SASコードです:

filename dest "%sysfunc(pathname(work))\backfill.sql"; 

data _null_; 
    attrib line length=$1000; 

    set sashelp.class; 

    file dest; 
    infile "sql_template.sas" end=template_eof; 

    call symput('name', quote(cats(name))); 
    call symput('age' , cats(age)); 

    do while (not template_eof); 
    input; 
    line = resolve(_infile_); 
    put line; 
    end; 
run; 

上記のコードを実行すると、目的の出力ファイルが生成されますが、データセット内の最初の観測のみが生成されます。

答えて

2

最初の観察の後、すでに入力テキストファイルの最後にあるので、このようにすることはできません。したがって、最初の観測ではDO WHILEループのみが実行されます。

私はずっと前にSAS-Lで学んだトリックです。 2つの入力ファイルを切り替えると、入力ファイルの先頭から再び開始することができます。

まず、サンプルテンプレートプログラムと空のダミーファイルを作成しましょう。

filename template temp; 
filename dummy temp; 

data _null_; 
    file template; 
    put 'INSERT INTO some_table (name,age)' 
    /' VALUES (&name,&age)' 
    /';' 
    ; 
    file dummy ; 
run; 

今度は、入力データを読み込み、テキストを変換するRESOLVE()機能を使用するためにデータステップを書いてみましょう。

filename result temp; 

data _null_; 
    length filename $256 ; 
    file result ; 
    set sashelp.class; 
    call symputx('name', catq('1at',name)); 
    call symputx('age' , age); 

    do filename=pathname('template'),pathname('dummy'); 
    infile in filevar=filename end=eof ; 
    do while (not eof); 
     input; 
     _infile_ = resolve(_infile_); 
     put _infile_; 
    end; 
    end; 
run; 

結果のファイルは次のようになります。私はそれを動作させることができました。このため

INSERT INTO some_table (name,age) 
    VALUES ('Alfred',14) 
; 
INSERT INTO some_table (name,age) 
    VALUES ('Alice',13) 
; 
... 
+0

感謝を。私の元の試みがうまくいかない理由を説明できますか?私は理解を向上させたいと思っています... –

+0

データステップの最初の反復で完全な入力テキストファイルを読み込みます。それから、データステップの次の観測に行くときにSASが最初からテキストファイルを読み始めるようにSASに指示する方法はありませんでした。 FILEVARオプションを使用することにより、ファイル名の値が変更されたときに入力テキストファイルを閉じて再オープンします。 – Tom

+0

ああ、申し訳ありませんが、以前のコメントでもっと明確にする必要がありました。私を混乱させたのは、観測1の後に私のコードが実際に私のデータセットの処理を停止することでした!私の 'data _null_'文を' data tmp'に変更すると、ノート内では単一の観察だけが読み取られます。これは私が理解していないものです。 –

関連する問題