2016-02-22 2 views
0

Я использую Oracle REGEXP_REPLACE для удаления всех нестандартных символов ascii (специальных) из поля freetext CLOB, который клиент использует для хранения данных, некоторые пользователи копируют и вставка из Excel, которая вызывает проблемы при чтении текста из CLOB. Мне удалось избавиться от всех специальных символов и сохранить макет для абзацев и т. Д.Oracle regexp_replace string cleanse в SQL-запросе, возвращающем полный набор данных, а не просто несоответствие строк

Проблема, с которой я сталкиваюсь, заключается в том, когда я сравниваю очищенное поле с оригиналом, после преобразования в строку символов, конечно, это возвращает строки, которые не имеют разницы между ними, я вытащил оба значения, и в большинстве случаев нет разницы. Это возвращение всего набора данных, а не только те, которые были cleansed.I've закончились идеи

FYI большая часть сохранения макета означает, что мне нужно, чтобы сохранить возврат каретки CHR (13)

Ниже приведен запрос

select * 
from (
select incident, entity, 
trim(to_char(textarea)) textarea, 
trim(to_char(regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']',''))) regexp_text 
from response 
) tab 
where tab.regexp_text <> tab.textarea 

Я попробовал несколько различных комбинации с подрезкой пробельных и подстрок мелких строк и т.д., не повезло

+0

Можете ли вы опубликовать некоторые примеры данных, с указанием ожидаемого и фактического результата? – Aleksej

+0

@Aleksej Ожидаемым результатом будут строки, которые не соответствуют i.e 'éklzéiuhkn' и' klziuhkn', за исключением того, что он также возвращает строки, которые соответствуют, а также те, которые не соответствуют –

+0

. Вы можете использовать http://stackoverflow.com/questions/22533037/how-to-call-oracle-md5-hash -функция для вычисления контрольной суммы MD5 для обоих столбцов результата, чтобы убедиться, что они действительно идентичны. –

ответ

0

Вашего шаблона является: '[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']'.

Каретка (^) заменяет собой все, что есть не специальный символ с пустой строкой. С настройками по умолчанию Oracle я бы ожидал, что это вернет пустую строку, которая рассматривается как NULL, но это не означает, что ничего не возвращается.

В любом случае, попробуйте удалить кареткой:

trim(to_char(regexp_replace(textarea, '[CHR(13) || CHR(32) || '-' || CHR(126) || ']',' '))) as regexp_text 
+0

Это не объясняет описанное поведение. –

+0

@GordonLinoff Когда я удаляю курсор, он делает противоположное и удаляет все символы, кроме специального –

0
WITH data (value) AS (
    SELECT 'éklzéiuhkn' FROM DUAL 
) 
SELECT REGEXP_REPLACE(value, '[^\r -~]', '') 
FROM data; 

Выходы:

REGEXP_R 
-------- 
klziuhkn 

Таким образом, ваш запрос должен быть чем-то вроде:

SELECT * 
FROM (
    SELECT incident, 
     entity, 
     TRIM(textarea) AS textarea, 
     TRIM(REGEXP_REPLACE(textarea, '[^\r -~]', '')) AS regexp_text 
    FROM response 
) 
WHERE textarea <> regexp_text; 
+0

Мне нужно сохранить возврат каретки –

+0

@KevinT заменен с '\ n' на' \ r'. – MT0

0

Я, наконец, понял, проблема заключалась в форматировании строк сравнения в предложении where, чтобы включить все символы Ascii и сопоставить с регулярным выражением, которое я планировал использовать, это был единственный способ устранить фиктивные и невидимые закодированные символы.

select incident, entity, 
regexp_replace(textarea,'[^' || CHR(13) || ' -}‘-~À-ü]',''))) regexp_text 
regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','') regexp_text2 
from response 
where to_char(regexp_replace(textarea,'[^' || CHR(163) || CHR(1) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','')) <> to_char(regexp_replace(textarea,'[^' || CHR(1) || '-' || CHR(255) || ']','')) 

Я включил обе линии, чтобы показать простое регулярное выражение из '[^' || CHR(13) || ' -}‘-~À-ü]', а также версию CHR(x). Мне также нужно было включить латинские символы в конце.

По какой-то причине использование только CHR() при указании символов ascii работает в 100% случаев, я думаю, что это может иметь какое-то отношение к настройкам среды NLS_LANG.

Это должно работать для всех тех, кто хочет, чтобы исключить странные закодированные символы из своих строк

Смежные вопросы