SAS:如何将定界和拆分列替换为多行?

SAS: How to replace delimit and split column to multiple rows?

我刚开始学习 SAS 编程,我正在尝试用“|”替换短语“@@@@”在 SAS Studio 中将单元格拆分为多行之前。

我在下面为这个实验创建了一个例子。它是 How to split a column into multiple rows in SAS 的参考,但我无法让它工作。 SYSTEM_ID 列打印良好,但 ITEM_LIST 未拆分。

我目前的输出如下:

这是我当前的代码。请帮忙。

data example1;
    input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
    datalines;
    ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
    ;
run;


data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
    set example1;
    
    ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
    do i = 1 to countw(ITEM_LIST_TRANS,"|");
       ITEM_LIST_SUB = scan(ITEM_LIST,i,"|");
       output;
    end;
run;

proc print data = example2;run;

你的解决方案有两个小问题:-)

  1. 您在扫描函数中引用了 ITEM_LIST 而不是 ITEM_LIST_TRANS
  2. 在您的示例数据中,您的数据是缩进的,因此 ID_1 成为 ITEM_LIST 的一部分。

看看这是否适合你

data example1;
input SYSTEM_ID $ ITEM_LIST $ 5-50 ;
datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;


data example2 (keep=SYSTEM_ID ITEM_LIST_SUB rename=(ITEM_LIST_SUB=ITEM_LIST));
    set example1;
    
    ITEM_LIST_TRANS = tranwrd(ITEM_LIST,"@@@@","|");
    do i = 1 to countw(ITEM_LIST_TRANS,"|");
       ITEM_LIST_SUB = scan(ITEM_LIST_TRANS,i,"|");
       output;
    end;
run;

proc print data = example2;run;

结果:

Obs SYSTEM_ID ITEM_LIST 
1   ID_1      Apple Juice 
2   ID_1      Orange 
3   ID_1      Banana Milk 

DLMSTR 将允许直接读取。

data example1;
   infile cards dlmstr='@@@@' missover;
   input SYSTEM_ID $ @;
   length item ;
   do until(missing(item));
      input item @;
      if not missing(item) then output;
      end;
   datalines;
ID_1 Apple Juice @@@@ Orange @@@@ Banana Milk
ID_2 Apple Juice @@@@ Orange @@@@ Banana Milk @@@@ Apple Juice @@@@ Orange @@@@ Banana Milk
;
run;
proc print;
   run;