删除 SAS 中的重复子字符串

Posted

技术标签:

【中文标题】删除 SAS 中的重复子字符串【英文标题】:Removing duplicate substring in SAS 【发布时间】:2021-03-09 20:07:28 【问题描述】:

在以下示例数据中,我尝试使用以下代码删除字符串中的重复子字符串:

data z;
input pvd_name_orig $50.;
datalines;
MD SMITH, JOHN MD
SMITH, JOHN W
MD T SMITH, JOHN W.
SMITH, JOHN WILLIAM
JOHN N MD SMITH MD
MD JOHN W. SMITH MD
MD SMITH, MD JOHN
;
run;

DATA want (keep=pvd_name_orig pvd_name_temp);
SET pvd_pmd_md;
   pvd_name_temp=scan(pvd_name_orig, 1, ' ');
   do i=2 to countw(pvd_name_orig,' ');
      word=scan(pvd_name_orig, i, ' ');
      found=find(pvd_name_temp, word, 'it');
      if found=0 then pvd_name_temp=catx(' ', pvd_name_temp, word);
   end;
run;

但是,上面的代码适用于所有名称,除了中间名首字母在字符串中重复的名称。在这种情况下,它会删除中间名的首字母,将其视为重复。有什么办法可以避免删除字符串中的单字母单词?

我尝试在中间名初始后手动添加一个句点,然后代码不会在新变量中删除它。但是,我无法使用 SAS 代码在中间名初始后添加句点。 我使用以下代码在第二个单词的第二个位置(随机)添加一个句点,但它只在字符串中的第二个字符添加一个句点。

data want;
   set z;

if length(compress(scan(pvd_name_orig,2,' '),'.'))=1 then substr(pvd_name_orig,2,1)='.';
   run;

我最终想要的输出是

       Obs    pvd_name_orig           pvd_name_temp

        1     MD SMITH, JOHN MD       MD SMITH, JOHN
        2     SMITH, JOHN W           SMITH, JOHN W
        3     MD T. SMITH, JOHN W.    MD T. SMITH, JOHN W.
        4     SMITH, JOHN WILLIAM     SMITH, JOHN WILLIAM
        5     JOHN N MD SMITH MD      JOHN N MD SMITH
        6     MD JOHN W. SMITH MD     MD JOHN W. SMITH
        7     MD SMITH, MD JOHN       MD SMITH, JOHN

有什么建议吗??

【问题讨论】:

为什么JOHN N不想转换成JOHN N. 模糊匹配不干净的数据在最好的情况下是有问题的。 SAS 有专门处理这个问题的产品,而 LinkKing 是免费软件,旨在处理其中一些问题,但不确定您的数据是否适合。 the-link-king.party @Richard JOHN N 可以转换为JOHN N. 这不是问题。 您能否将问题标题更新为重复标记,或重复单词。如果医生的名字和姓氏相同怎么办?如果名称包含单个字母后跟逗号怎么办?逗号前应该加句号吗? 【参考方案1】:

正则表达式可用于解决问题。这里\b是单词边界,\S+是不带空格的字符串,(\b\S+\b)是不带空格的单词; (.*) 是什么,第一个(\1)是需要删除的(\b\S+\b)的重复词; \1\2 表示保持 (\b\S+\b)(.*)。

data z;
input name $50.;
new_name=prxchange('s/(\b\S+\b)(.*)(\1)/\1\2/',-1,strip(name));
datalines;
MD SMITH, JOHN MD
SMITH, JOHN W
MD T SMITH, JOHN W.
SMITH, JOHN WILLIAM
JOHN N MD SMITH MD
MD JOHN W. SMITH MD
MD SMITH, MD JOHN
;
run;

【讨论】:

以上是关于删除 SAS 中的重复子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

两个字符串的所有公共最长子序列

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

数组篇在python中如何查找最长字符串子串

使用 Python 的字符串子序列内核和 SVM

2022华为机试真题 C++ 实现 字符串子序列II