4

これは簡単なように思えますが、ドキュメントでこれを行う方法が見つかりません。カンマ区切りのファイルを読みたいのですが、幅が非常に広いので、いくつかの列だけを読みたいのです。

私はこれを行うことができると思ったが、@ポインターは区切り文字で定義された列番号ではなく、テキストの列を指しているようだ:

data tmp;
 infile 'results.csv' delimiter=',' MISSOVER DSD lrecl=32767 firstobs=2;
 @1 id
 @5 name$
run;

この例では、区切り文字に基づいて 1 列目と 5 列目にあるものだけを読み取りたいのですが、SAS はテキスト ファイルの 1 番目と 5 番目にあるものを読み取っています。したがって、入力ファイルの最初の行が次のように始まる場合

1234567, "x", "y", "asdf", "bubba", ... その他の変数 ...

id=1234567とが欲しいのname=bubbaですが、 を取得してname=567, "います。

すべての列を読み、不要なものを削除できることはわかっていますが、もっと良い方法があるはずです。

4

3 に答える 3

6

実際、@は、区切られた列ではなく、テキストの列を指します。私が今までに見つけた標準入力を使用する唯一の方法は、空白で読み取ることでした。

input
id
blank $
blank $
blank $ 
name $
;

次に、空白をドロップします。

ただし、入力を別の方法で記述してもかまわない場合は、より良い解決策があります。

data tmp;
 infile datalines;
 input @;
 id = scan(_INFILE_,1,',');
 name = scan(_INFILE_,5,',');
 put _all_;
 datalines;
12345,x,y,z,Joe
12346,x,y,z,Bob
;;;;
run;

基本文字形式で不要な変数ごとにputまたはinputステートメントが必要になるため、フォーマットが少し面倒になりますが、必要に応じて簡単になる場合があります。

于 2012-09-20T13:52:01.570 に答える
1

INPUT ステートメントの構文を少し知っていれば、かなり効率的にフィールドをスキップできます。(3*dummy)(:$1.) の使用に注意してください。1 バイトだけを読み取ると、パフォーマンスもわずかに向上します。

data tmp;
   infile cards DSD firstobs=2;
   input id $ (3*dummy)(:$1.) name $;
   drop dummy;
   cards;
id,x,y,z,name
1234567, "x", "y", "asdf", "bubba", ... more variables 
1234567, "x", "y", "asdf", "bubba", ... more variables 
   run;
proc print;
   run;
于 2015-09-29T13:58:47.060 に答える
0

別のユーザーからの関連する質問に答えるときに考えたもう 1 つのオプション。

filename  tempfile temp;

data _null_;
  set sashelp.cars;
  file tempfile dlm=',' dsd lrecl=32767;
  put (Make--Wheelbase) ($);
run;


data mydata;
  infile tempfile dlm=',' dsd truncover lrecl=32767;
  length _tempvars1-_tempvars100 $32;
  array _tempvars[100] $;
  input (_tempvars[*]) ($);
  make=_tempvars[1];
  type=_tempvars[3];
  MSRP=input(_tempvars[6],dollar8.);
  keep make type msrp;
run;

ここでは、効果的に一時的な (残念ながら、実際には一時的ではありません) 変数の配列を使用し、列を指定して必要なものだけを取得します。これは小さなファイルの場合、おそらくやり過ぎです - すべての変数を読み込んで処理するだけです - しかし、15、18、および 25 だけが必要な 100 または 200 の変数の場合、これは簡単かもしれません。正確に欲しい。(たとえば、国勢調査データを CSV 形式で持っている場合に、これを使用することがわかります。最初の列から 100 列または 200 列下にあるいくつかの列だけが必要になることは非常に一般的です。)

一時配列の長さには注意が必要です (関心のある最長の列と同じ長さでなければなりません!)。データから明らかでない限り、失敗した場合。

于 2015-02-13T20:57:42.360 に答える