如何在SAS中将字符变量拆分为多个变量?

如何在SAS中将字符变量拆分为多个变量?,sas,Sas,我想将下面的字符变量(Have)拆分为多个变量(时间、车道和方向) 我得到了除Lane变量之外的所有变量 data up; set outdata; Hour=scan(Have, 1); Hour=compress(hour,'','a'); Lane = scan(Have, 2); Direction =scan(Have, -1); Direction = tranwrd(Direction, "Lanes", " "); run;

我想将下面的字符变量(Have)拆分为多个变量(时间、车道和方向)

我得到了除Lane变量之外的所有变量

data up; 
set outdata; 
Hour=scan(Have, 1); 
Hour=compress(hour,'','a'); 
Lane = scan(Have, 2); 
Direction =scan(Have, -1); 
Direction = tranwrd(Direction, "Lanes", " "); 
run;

下面是一个对示例数据有效的解决方案

尽可能使用SCAN(),然后使用TRANWRD“删除”找到的单词,最后只留下车道信息。这适用于示例数据,但可能无法根据实际数据中数据格式的变量进行概括。如果遇到边缘情况,请更新示例数据以反映这些情况

data up;
    set outdata;
    Direction=scan(Have, 2, "()");

    if anydigit(char(have, 1)) then
        do;
            hour=scan(have, 1);
        end;
    *Remove direction;
    have2=tranwrd(have, catt("(", Direction, ")"), "");
    *Remove time;
    Lane=compbl(tranwrd(have2, trim(hour), ""));
    keep Have Direction Hour Lane;
run;

proc print data=up;
run;

您可以使用有条件保持的
输入(
@
)来读取和保留
时间
值。读取
车道
方向
值需要其他
输入
语句功能,如调整后的分隔符列表(
dlm=

例如:

data outdata;
  attrib 
    time format=time5.
    lane length=$10
    direction length=$5
  ;

  retain time;

  input @;
  if index(_infile_,':') then input time time5. @;

  input lane direction;

  infile datalines dlm='()' missover;
datalines;
00:00 Lane 1 (North)
Lane 2 (North)
Lane 3 (South)
Lane 4 (East)
All Lanes
01:00 Lane 1 (North)
;

这两个问题相关吗?如果不是,你最好把它们分开?如果是,可能会更简单,但您需要确定它们之间的关系。似乎您正在尝试从格式不正确的Excel文件导入数据?或者字段是否始终位于特定位置?确切地说:(您可以跳过第二个问题……您能帮我回答第一个问题吗……我已经为除lane one之外的其他列做了哪些工作?如何从have变量中提取lane变量?如果您已经完成了其他列的工作,那么可以很容易地使用TRANWD删除其他组件。展示您所做的工作,我将展示如何实现TRANWR。)D函数。
data outdata;
  attrib 
    time format=time5.
    lane length=$10
    direction length=$5
  ;

  retain time;

  input @;
  if index(_infile_,':') then input time time5. @;

  input lane direction;

  infile datalines dlm='()' missover;
datalines;
00:00 Lane 1 (North)
Lane 2 (North)
Lane 3 (South)
Lane 4 (East)
All Lanes
01:00 Lane 1 (North)
;