Ошибка подстроки SSIS при использовании регистра при правильной функции

#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 и т. Д.) Не отображаются в пункте назначения