2016-12-03 9 views
0

これはいくつかのポインタ位置を使用してこれを読み取る必要があり、あとでかっこをトリムします。当分の間、私はロジックツリーにいくつかの問題を抱えています。これは、プログラムが異なるレベルに移動し、それに従って入力を適用するよう指示します。スタッガードフリーフォーマットデータの読み込みに問題があります

レベルそれぞれ1- 6位置1、10、19、28、37で開始し、46:

ここでデータファイルのほとんどのサンプルです。 enter link description here ここに私のコードです:

Data peg; 
    infile Pegasus dlm= ' '; 
    length Job_Title $23 Employee_Name $20; 
    input Level & @; 
    if Level="(Level1)" then 
    input @10 Job_Title & @34 Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level2)" then 
    input @19 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level3)" then 
    input @28 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level4)" then 
    input @37 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level5)" then 
    input @46 Job_Title & Employee_Name & @108 Salary dollar8. ; 
    else if Level="(Level6)" then 
    input @55 Job_Title & Employee_Name & @108 Salary dollar10.; 
run; 

enter image description hereこれは私が上記のコードを実行したときに何が起こるかです。

+0

いくつかのサンプルデータをテキストとして投稿してください。 – user667489

+0

誰も画像に基づいてコードを実行することはできません。私は長い行として各行を読んで、後に解析することをお勧めします。 SCAN()関数が役立ちます。 – Reeza

+0

レベル3はIF/THENであるため動作しません。条件が真であれば、他の条件はテストされません。したがって、2番目の条件が真であれば、if/thenのステップが完了し、3番目のステップには到達しません。 – Reeza

答えて

3

INFILEステートメントでDSDオプションを削除し、最初のINPUTからフォーマットを削除し、条件付きで生成されたINPUTの行を保持するために後続の@を追加すると、おそらくコードが機能します。 Employee_Name値はその周囲に()を持ちますが、後で削除することもできます。

infile Pegasus truncover ; 
length Level $8 Job_Title $23 Employee_Name $20 Salary 8; 
input Level @; 

しかし、あなたは、ハードコーディングされた列位置との条件付きで生成されたINPUT文は必要ありません。インデントを無視するだけです。文字列を読み込み、()の位置に基づいて値を解析します。

スペース文字の通常のデフォルトの区切り文字に加えて、区切り文字として()を扱うようにSASに指示した場合は、&修飾子を使用してフィールドを直接読み取ることができるくらい十分なデータです。それが変数にそれを読んで、それを解析するためにSCAN()を使用し、その後に動作しない場合は enter image description here

:ここ

data want; 
    infile cards dlm='()' truncover; 
    length Level $8 Job_Title $23 Employee_Name $20 Salary 8 ; 
    informat salary comma. ; 
    format salary dollar12. ; 
    input (Level -- Salary) (&) ; 
cards;                                 
(Level1) Chief Executive Officer (Anthony Miller)              $433,800      
     (Level2) Chief Sales Officer (Harry Highpoint)             $243,190      
        (Level3) Vice President (Henri Le Bleu)            $194,885      
          (Level4) Director (Reginald Steiber)           $156,065      
            (Level5) Sales Manager (Dennis Lansberry)        $84,260      
              (Level6) Sales Rep. I (Saunders Briggi)      $26,335      
;  

は、最初のいくつかの値がどのように見えるかです。

input string $107. salary; 
    level = scan(string,1,'()'); 
    job_title = left(scan(string,2,'()')); 
    employee_name = left(scan(string,3,'()')); 
+0

これはかなり単純化します。レベルに基づいてインデントやif/then/elseロジックをマスターしようとすれば、どうすればいいでしょうか?私は理想的にそれを行う方法も理解したいと思います。 – AvdotyaC

+0

INFILE文でDSDオプションを削除すると、あなたのコードが動作するでしょう。最初のINPUTからフォーマットを削除し、末尾の@を追加しました。 – Tom

+0

それはほとんど動作します...明るい側では、すべての観測にアクセスします。しかし、それはレベル1の名前にしかアクセスしません。他のものはちょっとしたジャンクです。私は上記の写真を添付し​​ました。 – AvdotyaC

関連する問題