You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否不使用赋值语句编写SAS程序读取两类数据生成PERSONEL临时数据集?

问题:无赋值语句实现SAS数据读取需求

参考数据

以下为目标数据的参考格式:

ID    Birthday          Monthly Salary   
P222  2 March 1976               9,600
P013  13 June 1955              31,450
S015  12 September 1966         27,500 

ID规则:首字符为职业缩写("P"代表教授,"S"代表职员),后接三位数字。

待读取的两类数据

(*)类数据

P222   2Mar1976   9,60000
P013  13Jun1955  31,45000
S015  12Sep1966  27,50000 

(**)类数据

P222 2Mar1976  $9,6,00
***************
P013 13Jun1955 $31,450
**************
S015 12Sep1966 $27,500
*********** 

需求

编写SAS程序读取上述两类数据,创建临时数据集PERSONEL,包含以下变量:

  • 字符型:ID(完整ID,如"P222")、OCCUPATION(职业缩写,如"P")
  • 数值型:BIRTHDAY(SAS日期值,如27821)、YEAR(出生年份,如1976)、SALARY(月薪数值,如9600)

提问:是否可以不使用赋值语句实现该需求?


回答

可以不使用显式赋值语句实现需求,通过SAS INPUT语句的位置定位、专用格式以及行过滤功能即可完成,分别处理两类数据如下:

一、处理(*)类数据的SAS程序

利用位置读取指定变量,结合SAS内置的日期、数值格式完成转换:

data PERSONEL;
  infile datalines truncover;
  /* 按位置精准读取各变量:
     - 先读完整ID,再从行首截取职业缩写
     - 用date9.格式将日期字符串转为SAS日期值
     - 直接从日期字符串的年份起始位读取四位数字作为YEAR
     - 用comma6.格式去除薪资中的逗号,转换为数值(若输入的9,60000为笔误,实际应为9,600,改用comma5.即可直接得到9600)
  */
  input @1 ID $4.
        @1 OCCUPATION $1.
        @6 BIRTHDAY date9.
        @13 YEAR 4.
        @16 SALARY comma6. ;
  datalines;
P222   2Mar1976   9,60000
P013  13Jun1955  31,45000
S015  12Sep1966  27,50000 
;
run;

说明:

  • @1重复定位行首,直接截取职业缩写,无需用substr赋值
  • date9.格式自动将2Mar1976转换为SAS日期值27821
  • 从日期字符串的固定位置读取年份,直接生成YEAR变量
  • comma6.格式自动处理带逗号的薪资,转换为纯数值

二、处理(**)类数据的SAS程序

需先过滤掉含*的分隔行,再读取有效数据,同时处理薪资中的多余逗号:

data PERSONEL;
  infile datalines truncover;
  /* 先锁定当前行,检查是否为分隔行 */
  input @;
  if index(_infile_, '*') = 0 then do;
    /* 读取有效数据:
       - 跳过$符号读取薪资,用comma6.格式自动去除多余逗号
       - 其余变量读取逻辑同(*)类数据
    */
    input @1 ID $4.
          @1 OCCUPATION $1.
          @6 BIRTHDAY date9.
          @13 YEAR 4.
          @21 SALARY comma6. ;
  end;
  datalines;
P222 2Mar1976  $9,6,00
***************
P013 13Jun1955 $31,450
**************
S015 12Sep1966 $27,500
*********** 
;
run;

说明:

  • input @保持行指针不移动,先判断行内容是否为分隔行
  • index(_infile_, '*')=0筛选出有效数据行,无需赋值语句
  • comma6.格式自动处理薪资中的多个逗号,将$9,6,00转换为9600

内容的提问来源于stack exchange,提问作者PowerPoint Trenton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:16:07