从 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。
谢谢
您可以结合使用 INDEX
、SUBSTR
和 SCAN
函数来实现此功能。
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
变量值的结果。有许多函数可用于连接字符串,请查看文档 CAT
、CATX
、CATS
中的一些示例。
希望这里有足够的帮助你。
我认为你可以使用函数 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;
这是输出数据集的部分打印。
从 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。
谢谢
您可以结合使用 INDEX
、SUBSTR
和 SCAN
函数来实现此功能。
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
变量值的结果。有许多函数可用于连接字符串,请查看文档 CAT
、CATX
、CATS
中的一些示例。
希望这里有足够的帮助你。
我认为你可以使用函数 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;
这是输出数据集的部分打印。