0

SAS を使用して読み取る生ファイルには、次のレコードがあります。

123、「ハロルド・ウィルソン」、Acct、1989 年 1 月 15 日、78,123 ドル

128、「ジュリア・チャイルド」、食品、1988 年 8 月 29 日、89,123 ドル

007、「ジェームズ・ボンド」、セキュリティ、2000 年 2 月 1 日、82,100 ドル

828、「ロジャー・ドーガー」、Acct、1999 年 8 月 15 日、$39,100

900、「アール ダベンポート」、食品、1989 年 9 月 9 日、45,399 ドル

906、「ジェームズ・スウィンドラー」、Acct、1978 年 12 月 21 日、78,200 ドル

SASコード:

options nocenter;

filename file1 'D:\files\SAS\raw-files\employee.csv';

data Employ;
infile file1 dsd;
input id       :       $3.
      name     :      $20.
      depart   :       $8.
      datehire : mmddyy10.  
      salary   :  dollar8.  
      ;
format datehire mmddyy10.
       salary    dollar8.;
run;

title 'Employee details';

proc print data=Employ;
run;

出力

従業員の詳細

Obs id 名 出発日 雇用者 給与

1 123 ハロルド・ウィルソン口座 1989 年 1 月 15 日 $78

2 128 ジュリア・チャイルド・フード 1988/08/29 $89

3 007 ジェームズ・ボンド証券 2000/02/01 $82

4 828 ロジャー・ドーガー口座 1999 年 8 月 15 日 $39

5 900 アール ダベンポート フード 1989 年 9 月 9 日 $45

6 906 ジェームズ スウィンドラー口座 1978 年 12 月 21 日 $78

問題 :

コンマ以降の給与部分を生ファイルと同じ形式で給与を取得する方法。

4

3 に答える 3

2

このCSVファイルを自分で作成した場合は、もう一度作成する必要があります。SASは、データ値のコンマをフィールド区切り文字と見なします(他のアプリケーションと同様)。

ファイルを再作成できない場合は、2つの列を異なるテキスト変数として読み取り、それらをコンマで連結し、INPUT関数を使用して結果を「読み取る」ことができます。

data Employ;
   infile file1 dsd truncover;
   input id       :       $3.
         name     :      $20.
         depart   :       $8.
         datehire : mmddyy10.
         salary_a :       $8.
         salary_b :       $8.
         ;
   salary = input( catx(',',salary_a,salary_b),dollar8.);
   drop salary_a salary_b;

   format datehire mmddyy10.
          salary    dollar8.;
run;

オプションがステートメントtruncoverに追加されていることに注意してください。infileこれは、SASが最後の変数(salary_b)を適切に処理できるようにするために重要です。

于 2012-08-19T15:09:05.280 に答える
2

上記のボブの優れた回答をフォローアップして、次のこともできます。

 data test;
  infile cards dsd truncover;
  input id name & : $20. depart : $12. datehire anydtdte10. salary comma8.;
  format id z3. datehire mmddyy10. salary dollar8.;
  cards;
  123,"Harold Wilson",Acct,01/15/1989,$78,123
  128,"Julia Child",Food,08/29/1988,$89,123
  007,"James Bond",Security,02/01/2000,$82,100
  828,"Roger Doger",Acct,08/15/1999,$39,100
  900,"Earl Davenport",Food,09/09/1989,$45,399
  906,"James Swindler",Acct,12/21/1978,$78,200
  ;
  run;

  proc print;
  run;
于 2012-08-19T18:49:39.327 に答える