使用SAS读取逗号分隔的文件

使用SAS读取逗号分隔的文件,sas,Sas,使用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 :

使用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;
123,“哈罗德·威尔逊”,会计,1989年1月15日,78123美元

128,“朱莉娅·查尔德”,食品,1988年8月29日,89123美元

007,“詹姆斯·邦德”,证券,2000年1月2日,82100美元

828,“罗杰·多格”,会计,1999年8月15日,39100美元

900,“达文波特伯爵”,食品,1989年9月9日,45399美元

906,“詹姆斯骗子”,账目,1978年12月21日,78200美元

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名称离职日期雇佣工资

1123哈罗德·威尔逊账户1989年1月15日78美元

2128 Julia儿童食品1988年8月29日$89

3 007詹姆斯·邦德证券公司2000年1月2日82美元

4828罗杰·多格账户08/15/1999$39

5900 Earl Davenport食品1989年9月9日45美元

6906詹姆斯骗子账户12/21/1978$78

问题:

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;

如何在忽略逗号后以与原始文件中相同的格式获取工资作为工资部分。

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

如果无法重新创建文件,可以将两列作为不同的文本变量读取,用逗号连接,然后使用输入函数“读取”结果:

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
选项已添加到
infle
语句中。这对于让SAS正确处理最后一个变量(salary_b)非常重要。

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

如果无法重新创建文件,可以将两列作为不同的文本变量读取,用逗号连接,然后使用输入函数“读取”结果:

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
选项已添加到
infle
语句中。这对于让SAS正确处理最后一个变量(工资)非常重要。

根据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;

根据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;

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

data Employ; infile file1 dsd; input id : $3. name : $20. depart : $8. datehire : mmddyy10. salary & dollar8. ; format datehire mmddyy10. salary dollar8.; run; 数据使用; 填充文件1 dsd; 输入id:$3。 姓名:20美元。 出发:8美元。 日期:mmddyy10。 薪水和美元8。 ; 格式为datehire mmddyy10。 薪金美元8。; 跑
符号(&)将继续读取薪资变量,直到遇到两个逗号分隔符。因此,可以正确读取文件。

我找到了解决问题的方法,即在读取薪资变量时使用符号(&),而不是冒号(:)修饰符且不使用特朗科

data Employ; infile file1 dsd; input id : $3. name : $20. depart : $8. datehire : mmddyy10. salary & dollar8. ; format datehire mmddyy10. salary dollar8.; run; 数据使用; 填充文件1 dsd; 输入id:$3。 姓名:20美元。 出发:8美元。 日期:mmddyy10。 薪水和美元8。 ; 格式为datehire mmddyy10。 薪金美元8。; 跑 符号(&)将继续读取薪资变量,直到遇到两个逗号分隔符。因此,可以正确读取文件