我正在尝试清除SQL Server数据库中的一列文本(在Azure中以防万一)。

文字包含人民的名字,并带有很多词缀(博士,教授,医学博士,博士学位,MSC和许多我不想要的可疑字符,;,;, (, )

我想从这些行中删除很多东西(通常在一个字段中多次删除),以至于我认为最好的方法是将它们添加到表中,并使用它来遍历并替换为每个一个空格,最后修剪并用一个空格替换多个空格,因为即使只将我需要从列中删除的所有项的1/3放入,嵌套的替换公式也看起来很疯狂。

最后-我想要的输出是将名字分为第一名,中间名和姓氏。一切都很干净,没有其他信息。

到目前为止,我一直在SSIS中处理数据,并探索了标准的T-SQL转换(使用嵌套的replace(),但增长如此之快,以至于令人讨厌)。我已经研究了派生列-再次看来,嵌套替换是这里唯一可行的选择!我终于尝试使用脚本组件找到解决方案,但是作为对此的业余爱好者,我一直无法弄清楚如何使用它,也没有找到任何示例。

效率也是一个问题,因为我最初要处理大约80万个名称。

非常感谢您的协助,因为我已经搜寻了很长时间,但没有发现任何可以直接帮助的东西。

最佳答案

兔子洞,全名的挑战存储在一个字段中,然后在T-SQL中解析,并将所有免责声明放在一边。

不管上面提到的那些项目如何,清理数据(尤其是text / varchar / nvarchar列)都是一个挑战,因为您发现嵌套的REPLACE可能会失控并且难以管理。

您可以在t-sql中做几件事,以帮助您完成所要完成的工作。所有这些将需要对数据进行多次传递。我看到这分为两个清洁类别。 1-删除定义的单词,2-特殊字符。


在您的案例名称前缀和后缀中,将“单词”放入要删除的表中。
基本上删除所有非字母字符。


如果我的名字前缀或后缀是“ Dean”或“ Miss”或...,名字是“ Dean Smith”或“ Missy”或...,是的,那是兔子洞。暂且不说,这里是一些示例代码,您可以尝试一下。

--Test table for words I want to strip out.
DECLARE @WordsToRemove TABLE
    (
        [word] NVARCHAR(200)
    );

--Test table for my data I want to clean
DECLARE @TestData TABLE
    (
        [Data] NVARCHAR(500)
      , [CleanData] NVARCHAR(500)
    );

--Flag I am using to keep my while loops going
DECLARE @Continue INT;


--Insert of the words I want to remove.
INSERT INTO @WordsToRemove (
                         [word]
                     )
VALUES ( 'DR' )
     , ( 'D.R.' )
     , ( 'M.D.' )
     , ( 'md' )
     , ( 'Prof.' );

--Insert test names to clean.  I have a while loop here, was loading my test table with 10000+ recrods to see performance.
--You can leave the while loop here commented out just to see how the code works.  I got under 2 minutes for 100000+ records.  Your mileage may vary.
--WHILE (SELECT COUNT(*) FROM   @TestData) < 100000
    --BEGIN
        INSERT INTO @TestData (
                              [Data]
                          )
        VALUES ( N'DR Jimmy Smith' )
             , ( 'D.R. John Jones M.D.' )
             , ( 'Timothy Neal DR md' )
             , ( 'Prof. Bob Smith Dr M.D.' )
             , ( 'Taco;,,; Johns Dr. Prof.' )
             , ( 'Prof. ''#%^Special Charaters;,,; Dr. Prof.' );
    --END;

--Just updating a another column so I can save original state
UPDATE @TestData
SET    [CleanData] = [Data]


--Join to my @WordsToRemove table using PATINDEX, continue doing that until all occurrences have been removed.
--Clean out words we dont want
SET @Continue = 1;
WHILE @Continue = 1
    BEGIN
        SET @Continue = 0;
        UPDATE     [a]
        SET        [a].[CleanData] = REPLACE([a].[CleanData], [b].[word], '')
                 , @Continue = 1
        FROM       @TestData [a]
        INNER JOIN @WordsToRemove [b]
            ON PATINDEX('%' + [b].[word] + '%', [a].[CleanData]) > 0;
    END;

--Remove all non-alpha characters, preserving spaces
--PATINDEX using "%[^a-z ]%" looks of anything not a character and not a space.
SET @Continue = 1;
WHILE @Continue = 1
    BEGIN
        SET @Continue = 0;
        UPDATE [a]
        SET    [a].[CleanData] = STUFF([a].[CleanData], PATINDEX('%[^a-z ]%', [a].[CleanData]), 1, '')
             , @Continue = 1
        FROM   @TestData [a]
        WHERE  PATINDEX('%[^a-z ]%', [a].[CleanData]) > 0;
    END;

SELECT *
FROM   @TestData;


然后从那里根据您的数据存储的格式,提取所需的每个部分。

关于c# - 从列中替换多个字符串元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53063523/

10-12 00:27
查看更多