【发布时间】:2016-11-10 07:07:29
【问题描述】:
我有一个数据集,其中包含 400 个 4 位代码的观察值,我想在两侧用空格填充
ex. Dataset
obs code
1 1111
2 1112
3 3333
.
.
.
400 5999
我怎样才能遍历另一个大型数据集,并将每次出现的任何填充的 400 代码替换为“”。
ex. Large Dataset
obs text
1 abcdef 1111 abcdef
2 abcdef 1111 abcdef 1112 8888
3 abcdef 1111 abcdef 11128888
...
我想要的数据集
ex. New Data set
obs text
1 abcdef abcdef
2 abcdef abcdef 8888
3 abcdef abcdef 11128888
...
注意:我只想替换两边用空格填充的 4 位代码。所以在obs 3中,1112不会被替换。
我尝试过执行以下 proc sql 语句,但它只查找并替换第一个匹配项,而不是所有匹配项。
proc sql;
select
*,
tranwrd(large_dataset.text, trim(small_dataset.code), ' ') as new_text
from large_dataset
left join small_dataset
on findw(large_dataset.text, trim(small_dataset.code))
;
quit;
【问题讨论】:
-
到目前为止你尝试过什么?如果遇到类似
abc111112abc的内容有两个匹配的 4 位代码但只能匹配其中一个,你会怎么做?如果您有类似abc00111100abc的内容,并且在一系列数字的中间有匹配项怎么办? -
@user667489 我已经编辑了我的问题,这样我就不会遇到你提到的两种情况的问题。我更新了我的原始帖子以包含我尝试过的内容。
-
只有 400 个 4 字节的字符串,您可以构造正则表达式,在一次函数调用中将它们全部替换。 SAS 字符串变量限制为 32K 字节。
-
@Tom 很想学习创建正则表达式来解决这个问题的另一种方法。我尝试使用很长的“其中文本不包含 code1 .. 或文本不包含 code2 ...”子句来执行 proc sql。但我不知道如何遍历我的 400 个代码列表并提取代码并将其附加到 where 子句。