SAS:解析字符串/字符值以查找多个分隔符

时间:2021-05-11 15:10:14

标签: parsing sas

我试图找到一种方法来解析相当长的文本字符串。我想在字符串中的某些单词之间提取一个子字符串。下面是我正在查看的文本类型的示例:

endElement

我想解析字符串并创建如下所示的列:

String1 = "Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -9234as-df32f-2f2f Error : Error_message1. Error : Error_message2. Error : Error_message3." 
String2 = "Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -zx3s-d2f-211 Error : Error_message1. Error : Error_message2." 

每个字符串的错误数量不同。

我已根据以下最初的两条评论更新了我当前的问题进展:

Obs# | ErrorType1      | ErrorType2      | ErrorType3
  1  | Error_message1  | Error_message2  | Error_message3  
  2  | Error_message1  | Error_message2  | 
If _N_ = 1 Then Pattern = Prxparse("/ Error /");
Retain Pattern;

这确实给了我第一次出现“错误”这个词后的整个子字符串 - 空格是故意的。但是,我无法创建循环或搜索字符串“ Error ”的所有出现。我有这样的想法。

Position = prxmatch(Pattern, Strings);
Substring = substr(Strings, Position);

但根据我的结果(String1 和 String2 为空),很明显我对 prxposn 函数缺乏了解。我刚刚找到了 PRXNEXT 函数,想试一试。还不确定如何一次只获取一条错误消息。

最好的问候!

1 个答案:

答案 0 :(得分:0)

您想要的是 CALL PRXNEXT,它遍历匹配项。 PRXPOSN 标识捕获缓冲区,意思是一组 ( ) - 但不直接将多个匹配项匹配到一个捕获缓冲区。

这应该有效:

data have;
String1 = 
"Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -9234as-df32f-2f2f Error : Error_message1. Error : Error_message2. Error : Error_message3." ;
rx_err = prxparse ('/Error : (.*?)\./ios');

start = 1;
stop = length(String1);
do _i = 1 by 1 until (position le 0);
    CALL PRXNEXT( rx_err, start, stop, String1, position, length);  
    if position gt 0 then do;
        err_msg = substr(string1,position,length);
        put position= length= err_msg=;
    end;
end;

run;

如果错误消息中可以包含在 . 上停止匹配可能会有问题,但如果是这样,您必须找到更好的方法来停止它。

正则表达式的工作原理是使用 (.*?) 匹配所有字符,但不贪婪,因此当它遇到 \.(句点)时它会停止。

如果您愿意,您可以在 PRXPOSN 之后使用 CALL PRXNEXT,仅获取 (),我相信始终将 1 作为捕获缓冲区的值。因此,不要使用 err_msg 赋值,而是使用:

err_msg = prxposn(rx_err,1,string1);
相关问题