将文本导入 SAS 数据集中的数组

Import text into array in SAS data set

我想将我的文本从下面的形式 (JSON) 更改为 sas 数据集。

[
  {
    "id":86374,
    "course":[
      "artificial intelligence",
      "data structure",
      "linear algebra"
     ]
   }
   {
    "id":12319,
    "course":[
      "data structure",
      "algorithm",
      "database",
      "linear algebra"
     ]
   }
...


]

由于课程数量因ID而异,我不知道如何将所有课程名称(可能是数组形式)保存到sas数据集中。

对于Json文件,可以通过proc groovy导入,这里是数据步骤。如果不知道每个学生上了多少门课,所以使用临时数组,然后将数据转置为每个ID的宽数据。

filename myjson 'd:\json.txt';
data temp;
   array temp (100) 0. _temporary_;
   infile myjson lrecl=10000 truncover scanover ;
       input @'"id":' ID .;
       input;    
       do i=1 by 1 ;
       input temp(i) 0. ;
       if not anyalpha(temp(i)) then leave;
       end;
       id=compress(id,',');
       do j=1 by 1;
          var=compress(temp(j),',""');
          if not anyalpha(temp(j)) then leave;
          output;
       end;
       drop i j;
run;

proc transpose data=temp out=want(drop=_name_) prefix=Couse;
by id notsorted;
var var;
run;

如果您不知道任何一个 ID 可能有多少门课程,我会避免在初始导入时使用数组,并且最初只导入长格式的数据。这样,转置就可以在以后作为一个单独的问题来处理了。

这是将数据导入长格式的替代方法,适用于每个 ID 任意数量的课程:

data want;
infile cards scanover dlm=',' dsd;
input @'"id":' id;
do until(index(_INFILE_,']'));
    input @;
    if not(indexc(_INFILE_,'[]')) then do;
        input course :0.;
        output;
    end;
    else input;
end;
cards;
[
  {
    "id":86374,
    "course":[
      "artificial intelligence",
      "data structure",
      "linear algebra"
     ]
   }
   {
    "id":12319,
    "course":[
      "data structure",
      "algorithm",
      "database",
      "linear algebra"
     ]
   }
]
;
run;

这假定 none 的课程名称包含方括号字符。您可以通过一些稍微复杂的逻辑来考虑这种可能性,以检查 json 行开头或结尾的方括号。

由于这似乎引起了一些混乱,因此您需要修改它才能使用它:

filename myjson "/path/to/my/json/file.txt";

data want;
infile myjson scanover dlm=',' dsd;
input @'"id":' id;
do until(index(_INFILE_,']'));
    input @;
    if not(indexc(_INFILE_,'[]')) then do;
        input course :0.;
        output;
    end;
    else input;
end;
run;