0

使用 SAS 读取的原始文件有以下记录:

123,“哈罗德·威尔逊”,会计,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 年 8 月 29 日 89 美元

3 007 詹姆斯邦德证券 02/01/2000 82 美元

4 828 Roger Doger Acct 08/15/1999 39 美元

5 900 伯爵达文波特食品 09/09/1989 45 美元

6 906 James Swindler Acct 1978 年 12 月 21 日 78 美元

问题 :

如何获取与原始文件中相同格式的薪水,因为逗号后的薪水部分被忽略。

4

3 回答 3

2

跟进 Bob 在上面的出色回答,您也可以这样做:

 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 回答
2

如果您自己创建了这个 CSV 文件,您应该重新创建它。SAS 将数据值中的逗号视为字段分隔符(与任何其他应用程序一样)。

如果您无法重新创建文件,您可以将两列作为不同的文本变量读取,用逗号连接它们,然后使用 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

我得到了解决问题的方法,即在读取薪水变量而不是冒号(:) 修饰符并且不使用trunco​​ver时使用与号(&)

数据使用;
    infile 文件 1 dsd;
    输入 ID:3 美元。
          姓名:20美元。
          出发:8 美元。
          约会:mmddyy10。  
          工资和美元 8。  
          ;
    格式化 datehire mmddyy10。
           工资 8 美元;
跑;

&将继续读取salary 变量,直到遇到两个逗号分隔符。因此,可以正确读取文件。

于 2012-08-20T17:52:07.287 回答