从单个sas单元提取观察列表

从单个sas单元提取观察列表,sas,Sas,我有一个sas数据集,它有一个嵌入在单个字符变量中的变量列表,由管道分隔。它看起来像这样: Obs。表格列表 1、“|表格(04-15-2003)|表格B(04-15-2004)|”, 2、“|形式(04-15-2002)|形式(04-15-2003)|形式B(04-15-2003)|” 我想将管道分隔的每个项提取为单独的变量,因此数据如下所示: 表一、表二、表三 1,“表格(04-15-2003)”,“表格B(04-15-2004)”,。, 2,“表格(04-15-2002)”、“表格(04-

我有一个sas数据集,它有一个嵌入在单个字符变量中的变量列表,由管道分隔。它看起来像这样:

Obs。表格列表

1、“|表格(04-15-2003)|表格B(04-15-2004)|”, 2、“|形式(04-15-2002)|形式(04-15-2003)|形式B(04-15-2003)|”

我想将管道分隔的每个项提取为单独的变量,因此数据如下所示:

表一、表二、表三

1,“表格(04-15-2003)”,“表格B(04-15-2004)”,。, 2,“表格(04-15-2002)”、“表格(04-15-2003)”、“表格B(04-15-2003)”

但我不知道该怎么做。我曾考虑过编写一个do循环来迭代每个管道,但这似乎不必要地复杂。关于更优雅的解决方案有什么建议吗?

使用
SCAN()
功能。首先,我们可以设置您的示例数据

data have ;
  obs+1;
  input list_of_forms $60. ;
cards;
|FormA(04-15-2003)||FormB(04-15-2004)|
|FormA(04-15-2002)||FormA(04-15-2003)||FormB(04-15-2003)|
;;;;
现在我们可以将其转换为多个列

data want;
  set have ;
  array form (3) $60 ;
  do i=1 to dim(form);
    form(i) = scan(list_of_forms,i,'|');
  end;
  drop i;
run;
为了使它更具动态性,您可以在整个数据集中找到最大数量的值,并替换新变量上硬编码的上限3

proc sql noprint ;
  select max(countw(list_of_forms,'|'))
    into :nforms 
    from have
  ;
run;
...
array form (&nforms) $60 ;

欢迎来到SO!如果汤姆的回答对你有帮助,你一定要投赞成票。如果它解决了你的问题,别忘了将他的答案标记为被接受的答案(投票按钮旁边会有一个复选标记,按下它,当被接受为答案时,它将变为绿色)。工作非常出色。谢谢