2017-07-20 18 views
0

私は最近、filevarステートメントについて知りました。これを使用して、複数の変数で分割されたさまざまなテキストファイルを書き込むことは可能ですか?私がオンラインで見たすべての例は、分割したい単一の変数に基づいたテキストファイルにしか書いていません。複数の変数を持つSAS filevarとfilerefの意味

たとえば、色についての文字変数、自動車の製造を詳述する文字変数、購入年の詳細を示す数値変数を含む車に関するデータセットがあるとします。

次に、これらのすべての変数で分割された複数のテキストファイルを一度に(ファイルパス内でそれらを連結してfilerefとして設定して)書き込むことができますか?ですから、私はmake = A、color = Red、year = 2000のテキストファイルを取得します。

また、私はfilerefという単語を見ていますが、実際には何かを明確に説明していません。直感的には、コードで参照できるファイルの名前の単なるエイリアスであると感じていますか?

ありがとうございました。

答えて

1

ala C/C++へのポインタとしてfilerefと考えることができます。

ファイル出力は、データセットの値を使用してドライブすることができます。ここでは、SASHELP.CARSデータの最初の数回の観測値を使用した例を示します。

proc sort data=sashelp.cars (where=(make in ('Acura', 'Audi', 'BMW'))) 
      out=cars; 
by make type; 
run; 

data _null_; 
set cars; 
by make type; 
retain fid; 
if first.type then do; 
    f_name = catt("c:\temp\",make,"_",type,".txt"); 
    rc = filename("temp",f_name); 
    fid= fopen("temp","o"); 
    rc = fput(fid,'make,model,type,msrp'); 
    rc = fappend(fid); 
end; 

rc = fput(fid,catx(",",make,model,type,msrp)); 
rc = fappend(fid); 

if last.type then do; 
    rc = fclose(fid); 
end; 
run; 

これは、車名とMSRPをリスト各MAKE, TYPEグループ用のCSVファイルを生成します。各グループについて

  1. f_nameは、出力のための物理的なファイル名です。 filename() およびfopen()関数は出力のためにファイルを開きます。 fidは、ファイルへの参照です。 です。
  2. fput()は、バッファに行を挿入します。
  3. fappend()は、バッファにファイルを追加します。ヘッダー の場合はこれを行い、レコードごとに1回行います。
  4. グループの最後に、あなたが絶対的に正しいfclose()
+0

返信ありがとうございます。私はこれをf_name行まで追跡し、何が起こっているのか理解できません。 (fidはSASが使用する隠れ変数ですか?) rc = filename(...)はあなたのfilerefの一時ファイルですか? Watはfilenameの2番目のパラメータを表します(SASのマニュアルはあまり役に立ちません)。このタイプのSASには新しい質問があります。 – VBACODER

+0

'fid'はポインタ変数です。私は答えにもう少し追加します。 – DomPazz

+0

これは良い例ですが、通常のファイルI/Oでこれを行うには 'filevar'を使うことができるので、残念です。 – Joe

1

と ファイルを閉じます。 filevarを使用して、データセット内のデータに基づいてファイル名を定義することができます。

ここでは、車種ごとに1つのファイルセットを作成するためにsashelp.carsを使用する簡単な例を示します。

filename a temp; 
data _null_; 
    set sashelp.cars; 
    outname = cats('c:\temp\',make,'.txt'); 
    file a filevar=outname dlm=','; 
    put make $ model $ mpg_city mpg_highway; 
run; 

aファイル名は、ジャンクファイル名である - それは構文でその場所で何かを持っている必要があるため、それがあります。何もしません(したがって、temp)。

注意:この方法を使用すると、ファイルを適切に(ファイルに対応するグループで)ソートする必要があります。それ以外の場合、それはあなたがそれを望む方法では動作しません。その変数によっての注文にある必要はありませんが、がその変数によってに配置されている必要があります。だから、これは素晴らしいです:

A 
A 
B 
B 
G 
G 
C 
C 
D 
D 

ではなく、この:

A 
B 
G 
C 
D 
A 
B 
G 
C 
D 
また、あなたは(あなたがそれをクリーンアップしない限り、それとして、 sashelp.carsmodelを使用しない法的なファイル名を持っていることを確認する必要があり

それには\のような違法な文字がたくさんあります)。

+0

答えをありがとう!しかし、これを拡張して、outname = cats( 'c:\ temp \'、make、color、prodyear'.txt ')と言ってもいいでしょう。ファイルを1つのファイルにまとめるために、ファイルを色と年に分けるために使用します。そしておそらくすべての組み合わせをループしますか?以前はSASでファイルを使用していたことはありませんでした。私はかなり初心者のプログラマーです。愚かな質問の謝罪。 – VBACODER

+0

確かに、あなたは絶対に(あなたはもちろん、たくさんのファイルを手に入れることができます)。ループを繰り返す必要はありません。データステップはそれを行います。 'outname'が法的なファイル名になり、出力する前に一つのファイルに出力したいレコードの集合がまとめてグループ化されるようにデータが編成されていれば、大丈夫です。 – Joe

+0

事前にデータをグループ化する必要はありません。 SASは、生成されたファイル名の変更に応じてファイルを開いたり閉じたりするだけです。 – Tom

0

FILEの文でFILEVAR=オプションについて話していると思います。これは、特定の変数の値を使用して書き込むファイルの名前を見つけるようにSASに指示します。あなたが望むものからそれを構築することができます。

filerefは、FILENAMEステートメントまたはFILENAME()関数を使用するときに作成するエイリアスです。 librefのように、LIBNAMEステートメントまたはLIBNAME()の機能を使用するときに作成する別名です。

したがって、1つまたは複数のファイルを指すfilerefを定義できます。

filename file1 '/project1/source.csv'; 
filename file2 ('/project1/source1.txt' '/project1/source2.txt'); 

次に、以前に引用した物理ファイル名を使用した可能性のある場所でfilerefを使用できます。

infile file1 dsd ; 
infile file2 eov=eov ; 

また、filerefを使用してディレクトリを指定することもできます。

filename raw '/project1/' ; 

さらに、()を追加して、これらのディレクトリ内の特定のファイルを参照してください。

infile raw('source.csv') dsd ; 
infile raw('source1.txt' 'source2.txt') eov=eov; 
file raw('export.csv') dsd ; 
関連する問題