从 SAS 中的列中的每个字符串中提取特定单词及其每一侧的多个标记?

Extracting a specific word and a number of tokens on each side of it from each string in a column in SAS?

从 SAS EG 中的列中的每个字符串中提取特定单词及其每一侧的多个标记?

例如,

row1: the sun is nice
row2: the sun looks great
row3: the sun left me 

是否有代码可以生成以下结果列(第一个是 sun 的 2 个词):

SUN IS 
SUN LOOKS
SUN LEFT 

如果出现重复匹配,可能还有第二列带有 COUNT。

因此,如果有 20 个 SUN LOOKS,那么它们将被分组并计数为 20。

谢谢

您可以结合使用 INDEXSUBSTRSCAN 函数来实现此功能。

INDEX - 采用两个参数和 returns 给定子字符串在字符串中出现的位置。您可以使用:

INDEX(str,'sun')

SUBSTR - 只是 returns 所提供字符串的子字符串,采用第二个数字参数来表示子字符串的起始位置。将其与您的 INDEX 函数结合使用:

SUBSTR(str,INDEX(str,'sun'))

这个 returns 从单词 'sun' 第一次出现的地方开始 str 的子串。

SCAN - returns 来自字符串的 'words',将字符串作为第一个参数,后跟一个引用 'word' 的数字。还有第三个参数指定分隔符,但默认为 space,因此您的示例中不需要它。

要找出 'sun' 之后的单词,您可以这样做:

SCAN(SUBSTR(str,INDEX(str,'sun')),2)

现在剩下要做的就是构建一个包含感兴趣单词的新字符串。这可以通过连接运算符来实现。要查看如何连接两个字符串,运行 这个说明性示例:

data _NULL_;
  a = 'Hello';
  b = 'World';
  c = a||' - '||b;
  put c;
run;

日志应包含此行:

Hello - World

作为使用 put 语句显示 c 变量值的结果。有许多函数可用于连接字符串,请查看文档 CATCATXCATS 中的一些示例。

希望这里有足够的帮助你。

我认为你可以使用函数 findw()scan() 来做你想做的事。这两个函数都基于单词边界的概念进行操作。 findw() returns 单词在字符串中的位置。知道位置后,您可以在循环中使用 scan() 来获取它后面的下一个或多个单词。

这里有一个简单的例子来展示这个概念。它绝不是一个完成或完善的解决方案,但旨在为您指明正确的方向。输入数据集(文本)包含您在问题中提供的句子,并稍作修改。数据步骤在句子中找到单词 "sun" 并创建一个名为 fragment 的变量,其中包含 3 个单词("sun" + 接下来的 2 个单词)。

data text2;
set text;
length fragment ;
word = 'sun'; * search term;
fragment_len = 3; * number of words in target output;

word_pos = findw(sentence, word, ' ', 'e');
if word_pos then do;
    do i = 0 to fragmen_len-1;
        fragment = catx(' ', fragment, scan(sentence, word_pos+i));
    end;
end;
run;

这是输出数据集的部分打印。