#ssis
#ssis
Вопрос:
Я использую приведенный ниже код в моем производном столбце SSIS для удаления заголовка в столбце Name, такого как Mr, Mrs, Ms и Dr.
Пример:-
Mr ABC
MS XYZX
Mrs qwrer
DR ADCS
ИТАК, я удаляю заголовок имени.
SUBSTRING( [Name] , 1, 3)=="Mr" amp;amp; LEN( [Name] ) >2 ? RIGHT([Name],LEN([Name])-2)
Но получение ошибки как неполного токена или недопустимого оператора.
Пожалуйста, помогите.
любое другое предложение по удалению префиксов также приветствуется, но необходимо использовать преобразование.
Комментарии:
1. Нам нужны примеры ваших данных, но что, если имя меньше 2 символов? Ваша правая функция сломается, потому что она не может работать с отрицательными числами.
2. @Brad вот почему я дал amp;amp; LEN([Имя] ) >2 или amp;amp; LEN([Имя] ) < 2, что остановит мое право на разрыв.
Ответ №1:
Другой способ взглянуть на проблему заключается в том, что вы хотите просмотреть первое «слово» в столбце Name
, где «word» — это набор символов от начала строки до первого пробела.
Сопоставление строк в SSIS чувствительно к регистру, поэтому вы захотите принудительно использовать первое слово в нижнем / верхнем регистре — однако ваш основной список заголовков указан в регистре (а затем убедитесь, что весь список заголовков состоит из нижнего / верхнего регистра).
Я сторонник того, чтобы облегчить себе жизнь, поэтому я добавлю производный столбец, на самом деле множество производных столбцов, которые будут определять позицию первого пробела в Name, и я назову это FirstSpace
DER GetFirstSpace
Добавьте новый столбец, называемый FirstSpace
. Выражение, которое мы хотим использовать, — это FINDSTRING
FINDSTRING([Name], " ", 1)
Это вернет позицию первого экземпляра пробела (или ноль, если пробел не найден).
DER GetFirstWord
Добавьте еще один производный столбец после DER GetGetFirstSpace
. Нам нужно сделать это, чтобы мы могли проверять передаваемые значения, чтобы получить первое слово. Делайте все это в одном производном столбце, и если вы что-то сделаете неправильно, вы не сможете его отладить, а реальная стоимость разработки — это обслуживание. Новый столбец FirstWord
будет иметь тип DT_WSTR 4000, потому что это то, что происходит, когда вы используете выражения для обработки строк. Я собираюсь перевести это в верхний регистр, так как мне это понадобится позже.
UPPER(SUBSTRING([Name], 1, [FirstSpace]))
- ЗАДАЧА: проверьте, будет ли это «DR» или «DR» с конечным пробелом, поскольку в настоящее время я кодирую это по памяти.
- ЗАДАЧА: что произойдет, если FirstSpace равно 0 — нам может потребоваться использовать тернарный оператор
?:
На данный момент в потоке данных у нас есть одно слово в столбце с именем FirstWord
, что нам нужно сделать, это сравнить его с нашим списком известных названий и, если оно существует, удалить его из оригинала. И это интересная проблема.
DER GetIsTitleMatched
Добавьте еще один производный столбец, на этот раз, чтобы решить, соответствуем ли мы нашему списку заголовков. Это будет столбец логического типа с именем IsTitleMatched
[FirstWord] == "DR" || [FirstWord] == "MRS" || [FirstWord] == "MR" || [FirstWord] == "MS"
Следуя этому шаблону «FirstWord — это точно равный буквальный текст ИЛИ …», когда этот производный столбец вычисляется, мы узнаем, является ли первое слово чем-то, что нужно удалить (окончательно)
DER SetFinalName
Здесь мы собираемся добавить еще один столбец, NameFinal
Волшебство удаления плохого слова будет заключаться в том, что мы используем ПРАВИЛЬНОЕ выражение, начинающееся с позиции этого открывающего пробела и идущее до конца слова. Возможно, вам потребуется добавить туда левую обрезку в зависимости от того, включает ли правильная операция начальную точку или нет. Опять же, бесплатная раздача на данный момент так хороша, но нет гарантии совершенства.
(IsTitleMatched) ? RIGHT([Name], [FirstSpace]) : [Name]
Я действительно нарушаю свое собственное правило здесь, поскольку у меня есть квазисложное выражение в положительном случае. Не стесняйтесь вставлять производную задачу столбца, которая вычисляет удаленную версию имени.
На данный момент у вас есть от 4 до 5 производных столбцов в вашем потоке данных, но вы можете добавить средство просмотра данных между каждым, чтобы убедиться, что вы получаете ожидаемый результат. Вы можете решить это по-своему, но это самый простой подход, который я могу придумать.
Комментарии:
1. спасибо за подробное объяснение, но если у меня так много производных столбцов, то как я буду сопоставлять столбец назначения, поскольку у меня есть только один столбец назначения для сопоставления.
2. Когда я учился в школе, на уроках математики всегда говорили, что мы должны показывать нашу работу. Подумайте о лишних столбцах как об этом — это место, где вы можете проверить свою работу, если это необходимо. Сопоставьте столбец
NetFinal
с именем столбца вашей целевой таблицы, а остальные (FirstSpace, FirstWord и т. Д.) Не отображаются в пункте назначения