Как удалить заменяющий символ Unicode из Снежинки - PullRequest
0 голосов
/ 26 февраля 2020

При загрузке данных в Snowflake с помощью команды COPY INTO существует параметр с именем: REPLACE_INVALID_CHARACTERS. Согласно документации, если для этого параметра установлено значение TRUE, все недопустимые символы UTF-8 заменяются символом замены Unicode, который выглядит следующим образом (�)

https://docs.snowflake.net/manuals/sql-reference/sql/copy-into-table.html#type -csv

Мой вопрос, как я могу удалить этот символ из данных в моей таблице? Я пытался использовать REGEXP_REPLACE, но не смог определить правильный шаблон для использования.

Вот пример того, как выглядят данные:

Unicode Replacement Character

Обратите внимание, что функция LENGTH даже не регистрирует, что здесь есть символ, так как он говорит, что есть 7 символов, когда их явно 8.

Любой совет о том, какую функцию Snowflake SQL использовать для удаления этих символов, будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

После продолжительной поддержки Snowflake мы наконец-то решили создать собственную функцию javascript для очистки не-ascii символов, включая этот символ замены юникода.

Что усложняло то, что Символ замены Юникода, который добавляет Снежинка, сам по себе не является допустимым символом, который затрудняет его удаление.

Функция, представленная ниже, является единственной найденной нами, которая надежно работает. Это также супер быстро:

CREATE OR REPLACE FUNCTION ADMIN.DESIGN.REPLACE_NON_ASCII("input" varchar, "replacement" varchar )
RETURNS varchar
LANGUAGE JavaScript
AS
$$

//This function is used to cleanse non ascii characters out of data included corrupt non-unicode characters

var output = "";
if (input == undefined){
    return input
}
else {
  for (var i=0; i<input.length; i++) {
      if (input.charCodeAt(i) >= 32 && input.charCodeAt(i) <= 127) {
          output += input.charAt(i);
      }
      else {
          output += replacement
      }
  }
  return output
}
$$
0 голосов
/ 26 февраля 2020

«Символ замены Юникода» равен \uFFFD, поэтому замена на '' должна работать

select replace('asdf�', '\uFFFD', '');
--Returns: asdf
...