C# 如何使用美英字符执行数据清理和子站点unicode(拉丁)Carachter
是否有方法执行数据清理和识别拉丁字符,如Á(及类似字符),并将其转换为最接近的美式英语字符(在本例中为“a”) 我更喜欢直接在TSQL代码中执行此操作,但如果不可能,我愿意使用其他选项,例如任何C#方法 我在一张表中有数十万条记录。数据条目有这样的错误,这些错误会导致问题,从而破坏代码 谢谢 更新的Anwer(20120212): 虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好 值得一提的是(我刚刚了解到这一点)C# 如何使用美英字符执行数据清理和子站点unicode(拉丁)Carachter,c#,tsql,C#,Tsql,是否有方法执行数据清理和识别拉丁字符,如Á(及类似字符),并将其转换为最接近的美式英语字符(在本例中为“a”) 我更喜欢直接在TSQL代码中执行此操作,但如果不可能,我愿意使用其他选项,例如任何C#方法 我在一张表中有数十万条记录。数据条目有这样的错误,这些错误会导致问题,从而破坏代码 谢谢 更新的Anwer(20120212): 虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好 值得一提的是(我刚刚了解到这一点)cyrlic\
cyrlic\u General\u CI\u AI
和Greek\u CI\u AI
同样有效。知道这一点很好,因为某些排序规则的性能比其他排序规则好,所以最好进行测试
先前的答案 您没有提到您正在使用的SQL Server版本 如果您使用的是SQL Server 2017+ 然后,您可以像这样利用: 返回:敏捷的绿狐跳过了懒狗 如果您使用的是早期版本的SQL 为此,您可以利用创建自己的翻译功能,我在本文末尾介绍了这一功能
SELECT t.NewString
FROM (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C)
CROSS APPLY samd.translate8K(@string,accents.C,clean.C) AS t;
以下是我用来生成重音字符字符串的代码:
SELECT CONCAT(
CHAR(225),CHAR(193),CHAR(226),CHAR(194),CHAR(228),CHAR(196),CHAR(227),CHAR(195),CHAR(224),CHAR(192), -- a(10)
CHAR(233),CHAR(201),CHAR(234),CHAR(202),CHAR(235),CHAR(203),CHAR(232),CHAR(200), -- e(8)
CHAR(237),CHAR(205),CHAR(238),CHAR(206),CHAR(239),CHAR(207),CHAR(236),CHAR(204), -- i(8)
CHAR(243),CHAR(211),CHAR(244),CHAR(212),CHAR(246),CHAR(214),CHAR(245),CHAR(213),CHAR(242),CHAR(210), -- o(10)
CHAR(250),CHAR(218),CHAR(251),CHAR(219),CHAR(252),CHAR(220),CHAR(249),CHAR(217), -- u(8)
CHAR(253),CHAR(221),CHAR(241),CHAR(209),CHAR(231),CHAR(199)) -- y(2),n(2),c(2)
自定义翻译功能:
CREATE FUNCTION samd.translate8K
(
@inputString VARCHAR(8000),
@characters VARCHAR(8000),
@translations VARCHAR(8000)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
/*****************************************************************************************
[Purpose]: Custom version of SQL Server 2017 Translate
-- Masking possible PII
DECLARE @inputstring VARCHAR(8000) =
'I don''t know if you got my SSN but it''s 555-90-5511. Call me at 312.800.5555';
SELECT t.newstring
FROM samd.translate8K(@inputString, '0123456789', REPLICATE('#',10)) AS t;
[Revision History]:
------------------------------------------------------------------------------------------
Rev 00 - 20180725 - Initial Development - Alan Burstein
****************************************************************************************/
SELECT newstring =
(
SELECT CASE WHEN c.chr>c.tx THEN '' WHEN c.chr>0 THEN t.chr ELSE ng.token END+''
FROM samd.NGrams8k(@inputString,1) AS ng
CROSS APPLY (VALUES(CHARINDEX(ng.token, @characters),LEN(@translations))) AS c(chr,tx)
CROSS APPLY (VALUES(SUBSTRING(@translations,c.chr,1))) AS t(chr)
ORDER BY ng.position
FOR XML PATH(''), TYPE
).value('text()[1]', 'varchar(8000)');
GO
更新的Anwer(20120212):
虽然我下面的答案会起作用,而且考虑到T-SQL翻译速度特别快,gotn发布的内容和David上面的答案会表现得更好
值得一提的是(我刚刚了解到这一点)cyrlic\u General\u CI\u AI
和Greek\u CI\u AI
同样有效。知道这一点很好,因为某些排序规则的性能比其他排序规则好,所以最好进行测试
先前的答案 您没有提到您正在使用的SQL Server版本 如果您使用的是SQL Server 2017+ 然后,您可以像这样利用: 返回:敏捷的绿狐跳过了懒狗 如果您使用的是早期版本的SQL 为此,您可以利用创建自己的翻译功能,我在本文末尾介绍了这一功能
SELECT t.NewString
FROM (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C)
CROSS APPLY samd.translate8K(@string,accents.C,clean.C) AS t;
以下是我用来生成重音字符字符串的代码:
SELECT CONCAT(
CHAR(225),CHAR(193),CHAR(226),CHAR(194),CHAR(228),CHAR(196),CHAR(227),CHAR(195),CHAR(224),CHAR(192), -- a(10)
CHAR(233),CHAR(201),CHAR(234),CHAR(202),CHAR(235),CHAR(203),CHAR(232),CHAR(200), -- e(8)
CHAR(237),CHAR(205),CHAR(238),CHAR(206),CHAR(239),CHAR(207),CHAR(236),CHAR(204), -- i(8)
CHAR(243),CHAR(211),CHAR(244),CHAR(212),CHAR(246),CHAR(214),CHAR(245),CHAR(213),CHAR(242),CHAR(210), -- o(10)
CHAR(250),CHAR(218),CHAR(251),CHAR(219),CHAR(252),CHAR(220),CHAR(249),CHAR(217), -- u(8)
CHAR(253),CHAR(221),CHAR(241),CHAR(209),CHAR(231),CHAR(199)) -- y(2),n(2),c(2)
自定义翻译功能:
CREATE FUNCTION samd.translate8K
(
@inputString VARCHAR(8000),
@characters VARCHAR(8000),
@translations VARCHAR(8000)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
/*****************************************************************************************
[Purpose]: Custom version of SQL Server 2017 Translate
-- Masking possible PII
DECLARE @inputstring VARCHAR(8000) =
'I don''t know if you got my SSN but it''s 555-90-5511. Call me at 312.800.5555';
SELECT t.newstring
FROM samd.translate8K(@inputString, '0123456789', REPLICATE('#',10)) AS t;
[Revision History]:
------------------------------------------------------------------------------------------
Rev 00 - 20180725 - Initial Development - Alan Burstein
****************************************************************************************/
SELECT newstring =
(
SELECT CASE WHEN c.chr>c.tx THEN '' WHEN c.chr>0 THEN t.chr ELSE ng.token END+''
FROM samd.NGrams8k(@inputString,1) AS ng
CROSS APPLY (VALUES(CHARINDEX(ng.token, @characters),LEN(@translations))) AS c(chr,tx)
CROSS APPLY (VALUES(SUBSTRING(@translations,c.chr,1))) AS t(chr)
ORDER BY ng.position
FOR XML PATH(''), TYPE
).value('text()[1]', 'varchar(8000)');
GO
参考:(感谢评论中的@gotqn)
结果:
hello! this is a test!
参考:(感谢评论中的@gotqn)
结果:
hello! this is a test!
您可以简单地转换T-SQL:-)中的数据您可以简单地转换T-SQL:-)中的数据