Как выполнить очистку данных и подставить караттеры Unicode (LATIN) с символами US Engli sh - PullRequest
0 голосов
/ 11 февраля 2020

Есть ли способ выполнить очистку данных и определить символы LATIN, такие как Á (и аналогичные), и преобразовать их в ближайший символ США Engli sh (в данном случае, 'A')?

Я предпочитаю делать это непосредственно в коде T SQL, но если это невозможно, я готов использовать другие опции, такие как любой метод C#.

https://en.wikipedia.org/wiki/List_of_Unicode_characters

У меня в таблице сотни тысяч записей. что записи данных имеют такие ошибки, это вызывает проблемы, которые нарушают код ..

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Ссылка: (Спасибо @gotqn в комментариях) stackoverflow.com / a / 12715102/1080354

SELECT 'héllö! this is à test!' Collate SQL_Latin1_General_CP1253_CI_AI

результат:

hello! this is a test!
1 голос
/ 11 февраля 2020

Обновлено Anwer (20120212):

Хотя мой ответ ниже будет работать, и учитывая, что T- SQL TRANSLATE особенно быстр, то, что было опубликовано, и ответ Дэвида выше, будут работать намного лучше.

Стоит отметить (я только что узнал), что и Cyrillic_General_CI_AI, и Greek_CI_AI также работают. Это полезно знать, потому что некоторые параметры сортировки работают лучше, чем другие, поэтому это хорошо для тестирования.


Предыдущий ответ

Вы не упомянули, какую версию SQL Server вы используете.

Если вы используете SQL Сервер 2017 +

Тогда вы можете использовать ПЕРЕВОД примерно так:

DECLARE @string VARCHAR(100) = 'Thë Quìck Grééñ Fox Jumps ôver The Lázy Dög.';

SELECT      NewString = TRANSLATE(@string,accents.C,clean.C)
FROM        (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C);

Возвращает: Быстрый зеленый лис перепрыгивает через Ленивую собаку.

Если вы используете более раннюю версию SQL

Для этого Вы можете использовать NGrams8K , чтобы создать свою собственную функцию ПЕРЕВОДА, которую я включил в конце этого поста.

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

https://emw3.com/unicode-accents.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...