我正在尝试清理 SQL Server 数据库中的一列文本(在 Azure 中,以防万一)。
文本包含人名,有很多词缀(dr.、Prof.、M.D.、PhD.、MSC,以及很多我不想要的可疑字符,;,;,
(, )
等
我想从这些行中删除很多东西 - 通常在一个字段中多次删除 - 我认为最好的方法是将它们添加到表中并使用它来运行和替换每个和每个都有一个空格,最后修剪并用一个空格替换多个空格,因为即使只放入我需要从列中删除的所有术语的 1/3,嵌套替换公式看起来也很疯狂。
最后 - 我想要的输出是将名字分成第一个名字,中间名,姓氏。一切都干净整洁,没有其他信息。
到目前为止,我一直在 SSIS 中处理数据,并探索了标准 T-SQL 转换(使用嵌套的 Replace(),但增长得太多,以至于令人讨厌)。我已经探索了派生列 - 再次看来嵌套替换是这里唯一现实的选择!?我终于尝试找到使用脚本组件的解决方案,但作为这方面的业余爱好者,我一直无法弄清楚如何使用它,也没有找到任何示例。
效率也是一个问题,因为我最初需要处理大约 800,000 个姓名。
对于此事的任何帮助,我将非常感激,因为我已经搜索了很长时间,但没有找到任何直接有帮助的东西。
最佳答案
兔子洞,将全名存储在一个字段中,然后在 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/