最初に見つかった値で設定されている文字長のデフォルトの動作を上書きし、セッションのすべての文字データを同じ固定長?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
声明を持つことが重要であることがわかります。データセットはそれほど大きくはないので、すべての文字長を一定量に設定することは意味があり、切り捨てが発生しないことが保証されます。私はデフォルトの数値の長さで十分であることがわかります。
このアプローチの問題は、変数名などを変更する必要があるときはいつでも、私はlength
とinput
の両方のステートメントに変更を加える必要があるということです。これは、特に150の変数がある場合には迷惑になり、不要であることを望んでいます。
リストの入力は私のニーズに適しているようです。私は、列の入力を使用することができますが、私は周りの列の幅を定義するのが面倒だ。私は、150列を扱う際に、それを簡単なプロセスにする方法は考えていません。すべての文字の長さをグローバルに定義することができるので、数値のデフォルトの8と同じように、私の問題は解決します。これは可能ですか?または、おそらくあなたはmyData.txt
のようなデータを持ち込むためのより良い方法がありますか?
これは素晴らしいことです!明確にするために、 '(:)は[入力修飾子] [1]またはワイルドカードとして機能しますか? [1]:http://support.sas.com/documentation/cdl/en/lestmtsref/69738/HTML/default/n0lrz3gb7m9e4rn137op544ddg0v.htm#p1wk2kecsf6iz8n1ufug4i5pg6id –
入力形式の修飾子です。 second()の中にインフォーメートリストが必要ですが、(\ _all_)リストにどの変数が入っているのか分からないので、実際のインフォーメントをリストしたくありません。 – Tom
':'の代わりに '+ 0'をフォーマットリストとして使うこともできます。これは、列の位置をゼロの列だけ前に移動することを意味します。したがって、 '()'の2番目の組の中に書式リストを持つ構文構造を満足するだけです。 – Tom