【问题标题】:SAS: Parsing a string/character value looking for multiple delimitersSAS:解析字符串/字符值以查找多个分隔符
【发布时间】:2021-05-11 15:10:14
【问题描述】:

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

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  | 

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

我已根据以下最初的两个 cmets 更新了我当前的问题进度:

If _N_ = 1 Then Pattern = Prxparse("/ Error /");
Retain Pattern;
Position = prxmatch(Pattern, Strings);
Substring = substr(Strings, Position);

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

    if prxmatch(Pattern, Strings) then
    do;
        String1 = prxposn(Pattern, 1, Strings);
        String2 = prxposn(Pattern, 2, Strings);
    end;

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

最好的问候!

【问题讨论】:

  • 看看SCAN()函数。
  • Regex 在这里可能是一个不错的选择。检查prxparseprxposn 函数。您可以使用这些来查找特定的字符串并返回它们的开始和结束位置。
  • SCAN() 函数似乎需要对要解析的字符串进行非常“严格”的设置,这是我的字符串不符合的标准。使用正则表达式可能是更好的方法,我会尝试研究它。我已经更新了我上面的问题,如果你认为你能在我的路上帮助我。

标签: parsing sas


【解决方案1】:

您想要的是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;

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

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

如果你愿意,你可以在CALL PRXNEXT 之后使用PRXPOSN,只得到(),我相信,总是有1 作为捕获缓冲区的值。因此,不要使用 err_msg 分配,而是使用:

err_msg = prxposn(rx_err,1,string1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多