0

だから私はsasデータセットに変換しようとしているかなり厄介なテキストファイルを持っています。これは次のようになります(はるかに大きいですが):

0305679  SMITH, JOHN  ARCH05  001  2
ARCH05  005  3
ARCH05  001  7

5つの個別の変数(ID、名前、仕事、時間、時間)を設定しようとしていますが、最初の行の後に表示される変数は明らかに3つだけです。私はこれを試しました:

infile "C:\Users\Desktop\jobs.txt" dlm = '  ' dsd missover;
input ID $ name $ job $ time hours;

正しい出力が得られなかったので、それを解析しようとしました

infile "C:\ Users \ Desktop \ jobs.txt" dlm ='' dsd missover; allData$を入力します。id = substr(allData、find(allData、 "305")-2、7);

しかし、まだ正しい出力が得られていません。何か案は?

編集:今、.scan()と.substr()を使用して、より大きなデータセットを分離しようとしていますが、データから1行をサブセット化するにはどうすればよいですか?

4

2 に答える 2

2

あなたのデータはそれほど乱雑ではないかもしれません。最初の行に5つの変数すべてが含まれ、後続の行に変数3〜5の値が含まれる階層形式の場合があります。つまり、ファイルを読み進めるときにIDとNAMEを保持する必要があります。

それが正しければ(それは階層的なレイアウトです)、これは可能な解決策です:

data have;
   retain ID NAME;
   informat ID 7. JOB $6. TIME 3. HOURS 1.;
   input @1 test_string $7. @;
   if notdigit(test_string) = 0
      then input @1 ID NAME $12. JOB time hours;
      else input @1 JOB time hours;
   drop test_string;
   datalines;
0305679  SMITH, JOHN  ARCH05  001  2 
ARCH05  005  3 
ARCH05  001  7 
0305680  JONES, MARY  ARCH06  002  4 
ARCH06  005  3 
ARCH07  001  7 
run;

重要なことは、rawファイルがどのように編成されているかを実際に理解することです。ルールを理解したら、SASを使用してそれを読むのは簡単です!

于 2012-07-19T23:26:40.187 に答える
0
 A list input solution could be the following:



data have;
array all(6) $20. ID LNAME FNAME JOB TIME HOURS;
 retain Id Lname Fname;
 drop i;
 input @; 
  nitems = countw(_infile_,', ');  
    if notdigit(scan(_infile_,1)) = 0 then 
     do i = 1 to nitems;
       all(i) = Scan(_infile_,i);
     end;
    else 
     do i = 1 to 3;
    all(i+3) = Scan(_infile_,i);
      if i = 6 then all(i) = all(i)*1;
  end;
datalines;
0305679  SMITH, JOHN  ARCH05  001  2 
ARCH05  005  3 
ARCH05  001  7 
0305680  JONES, MARY  ARCH06  002  4 
ARCH06  005  3 
ARCH07  001  7 
run;

proc print; run;
于 2012-07-30T16:55:29.323 に答える