2016-12-14 3 views
0

最初に見つかった値で設定されている文字長のデフォルトの動作を上書きし、セッションのすべての文字データを同じ固定長?SAS:セッション内のすべての文字タイプデータのデフォルト長を設定する


私が毎日扱っているデータの大半は、.csvや.txtなどの形式や構造が似ています。私はリスト入力でinfileステートメントを使用すると、この種のデータをインポートするのに適していることがわかります。

たとえば、テキストファイルmyData.txtがあるとします。

  myData.txt 
string1 string2 num1 string3 num2 
hello there 12 this 33 
is  some 45 sample 2 
data for  8 you  12 

私は、その後にそれを持って来るために、このようなコードを使用します。

%let dataDirectory = C:\path\to\file; 
%let dataFile  = myData.txt; 

filename myFile "&dataDirectory.\&dataFile."; 
data in_data; 
    infile myFile dsd dlm = '09'x firstobs = 2; 

    length 
    string1 $ 50. 
    string2 $ 50. 
    num1  8 
    string3 $ 50. 
    num2  8 
    ; 

    input 
    string1 $ 
    string2 $ 
    num1 
    string3 $ 
    num2 
    ; 
run; 
filename myFile clear; 

を、私は私のデータのどれも切り捨てられないようにlength声明を持つことが重要であることがわかります。データセットはそれほど大きくはないので、すべての文字長を一定量に設定することは意味があり、切り捨てが発生しないことが保証されます。私はデフォルトの数値の長さで十分であることがわかります。

このアプローチの問題は、変数名などを変更する必要があるときはいつでも、私はlengthinputの両方のステートメントに変更を加える必要があるということです。これは、特に150の変数がある場合には迷惑になり、不要であることを望んでいます。

リストの入力は私のニーズに適しているようです。私は、列の入力を使用することができますが、私は周りの列の幅を定義するのが面倒だ。私は、150列を扱う際に、それを簡単なプロセスにする方法は考えていません。すべての文字の長さをグローバルに定義することができるので、数値のデフォルトの8と同じように、私の問題は解決します。これは可能ですか?または、おそらくあなたはmyData.txtのようなデータを持ち込むためのより良い方法がありますか?

答えて

1

デフォルトの長さを格納するためにマクロ変数を使用できます。その後、1か所で変更できます。

INPUTステートメントで変数リストを使用すると、変数名を複数回入力することを心配する必要がなくなります。

%let dataDirectory = C:\path\to\file; 
%let dataFile  = myData.txt; 
%let defLength = $80 ; 

data in_data; 
    infile "&dataDirectory/&dataFile" dsd dlm='09'x firstobs=2 truncover ; 

    length 
    string1 &defLength 
    string2 &defLength 
    num1  8 
    string3 &defLength 
    num2  8 
    ; 

    input (_all_) (:) ; 
run; 
+0

これは素晴らしいことです!明確にするために、 '(:)は[入力修飾子] [1]またはワイルドカードとして機能しますか? [1]:http://support.sas.com/documentation/cdl/en/lestmtsref/69738/HTML/default/n0lrz3gb7m9e4rn137op544ddg0v.htm#p1wk2kecsf6iz8n1ufug4i5pg6id –

+0

入力形式の修飾子です。 second()の中にインフォーメートリストが必要ですが、(\ _all_)リストにどの変数が入っているのか分からないので、実際のインフォーメントをリストしたくありません。 – Tom

+1

':'の代わりに '+ 0'をフォーマットリストとして使うこともできます。これは、列の位置をゼロの列だけ前に移動することを意味します。したがって、 '()'の2番目の組の中に書式リストを持つ構文構造を満足するだけです。 – Tom

0

適切な順序で長さステートメントを保持する場合は、INPUTステートメントにSAS変数リストを使用できます。入力文に$記号は必要ありません。いくつかの変数に対してINFORMATSを使用する場合は、関連付けるINFORMATステートメントを使用します。

data in_data; 
    infile myFile dsd dlm = '09'x firstobs = 2; 

    length 
    string1 $ 50. 
    string2 $ 50. 
    num1  8 
    string3 $ 50. 
    num2  8 
    ; 

    input (string1--num2)(:); 
run; 
+0

あなたは 'input string1 - num2;'を使うことができます。あるいは、 '_ALL_'で構造体をさらに使いやすくすることができます。 'input(_all _)(:);'のように – Tom

0

あなたは、SASは、procのインポートを使用して「guessingrows」オプションを使用してフィールド属性を決定するために使用する必要がある行数を指定することができます。そうすることで、proc importはあなたが持つ可能性のある新しい変数をいくつでも処理します。

proc import out=importeddata 
      datafile= "/examplepath/file.txt" 
      dbms=dlm replace; 
     delimiter='09'X; 
     getnames=YES; 
     guessingrows=5000; 
run; 
関連する問題