Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从混乱的字符串中提取名称_Arrays_String_Sas_Data Manipulation_Data Cleaning - Fatal编程技术网

Arrays 从混乱的字符串中提取名称

Arrays 从混乱的字符串中提取名称,arrays,string,sas,data-manipulation,data-cleaning,Arrays,String,Sas,Data Manipulation,Data Cleaning,messy是一个SAS字符变量,包含作者在自己的作品中引用的论文列表 下面是对凌乱的一个观察 该记录包括2个参考-一个从标签开始:1;另一个从标签2;开始 我需要为每个引用创建在name:之后返回部分内容的字符变量。对于这个观察,它看起来是这样的: clean1 clean2 AZAD.MEGHAN BAI.JING 我尝试在数据步骤中使用扫描功能执行此操作,如下所示: data ex2; length lastname1-lastname10

messy是一个SAS字符变量,包含作者在自己的作品中引用的论文列表

下面是对凌乱的一个观察

该记录包括2个参考-一个从标签开始:1;另一个从标签2;开始

我需要为每个引用创建在name:之后返回部分内容的字符变量。对于这个观察,它看起来是这样的:

clean1            clean2
AZAD.MEGHAN       BAI.JING
我尝试在数据步骤中使用扫描功能执行此操作,如下所示:

data ex2;
length lastname1-lastname10 
       lastname1-lastname10 
       clean1-clean10 $100; /*initializes empty variables for storing up to 10 names*/
set ex;

array lastname  {*} lastname1-lastname10;
array firstname {*} firsttname1-firstname10;
array clean     {*} clean1-clean10;

do i=1 to count(messy, "label:"); /*loop through messy as many times as there are names*/
  lastname{i}  = scan(messy, 1, "name:"); /*pick up first word after name*/
  firstname{i} = scan(messy, 2, "name:"); /*pick up second word after name*/ 
  clean{i}     = cats(upcase(lastname{i}), ".", upcase(firstname{i})); 
end;

run;
这里至少有两个问题:

我的循环不会拾取观察中的第n个名称;在第一次出现name:之后,它将继续将扫描内容的结果写入lastname和firstname数组中的变量。 我显然误解了扫描本身的工作原理!我认为第三个参数允许我指定自己选择的分隔符,但scanmassy的结果是1,name:;如我所料,返回l而不是AZAD。 具体问题:


我如何在messy变量中提取所有名称并将它们分别存储为clean1、clean2等?

我会使用PRX*来处理这些事情

data ex2;
length clean1-clean10 $100;
set ex;
array clean     {*} clean1-clean10;
if _N_=1 then ExpressionID+prxparse('/[(;]name:([^;)]+)[;)]/');
start = 1;
stop = length(messy);
call prxnext(ExpressionID, start, stop, messy, position, length);
i=0;
do while (position > 0);
  i+1;
  clean{i} = prxposn(ExpressionID, 1, messy);
  call prxnext(ExpressionID, start, stop, messy, position, length);
end;

run;
SCAN的第三个参数允许提供一组分隔符,使用name:不查找“name:”,正如您所希望的,它查找“n”、“a”、“m”、“e”或“:”
data ex2;
length clean1-clean10 $100;
set ex;
array clean     {*} clean1-clean10;
if _N_=1 then ExpressionID+prxparse('/[(;]name:([^;)]+)[;)]/');
start = 1;
stop = length(messy);
call prxnext(ExpressionID, start, stop, messy, position, length);
i=0;
do while (position > 0);
  i+1;
  clean{i} = prxposn(ExpressionID, 1, messy);
  call prxnext(ExpressionID, start, stop, messy, position, length);
end;

run;