将文本导入 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;
我想将我的文本从下面的形式 (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;