2013-06-27 2 views
2

я работаю с SQL Server 2012 и Visual Studio 2010 с Excel 2007.Сплит один Название столбца в двух столбцах с помощью SSIS

Я строю пакет, который будет извлекать информацию из .CSV файла и импортировать его в таблицу в БД, которую мы создаем для проекта HRIS.

Файл .CSV имеет следующие поля, начиная с В9 и проходит через колонку J (длина строки будет меняться)

| PersNo | IDNo | Name | PArea | OrgUnit | OrgName | UserID | EntryDate | 

Проблема у меня есть, что мне нужно взять Name столбец и разделить его на FirstName и LastName столбцов. Я просмотрел интернет и нашел несколько форумов, в которых подробно описаны методы, которые используют Derived Columns, условный разделитель, компонент скрипта и MultiCast. Ни один из них не был полезен или не отвечал моим потребностям.

Проблема сложная по названию. У меня есть три разных типа имен, которые можно отобразить.

John Smith 
John A Smith 
John Smith III 

Последние два они должны быть разделены по-разному.

Если есть среднее начальное, они хотят, чтобы он был разделен как таковой.

| FirstName | LastName | 
------------------------ 
| John  | Smith A | 

т.е. Смит и средний инициал будет в LastName колонке

Если они имеют суффикс, то они должны быть разделены как таковой.

| FirstName | LastName | 
------------------------- 
| John  | Smith III | 

т.е. Смит и суффикс будет в LastName колонке

мне нужно знать, если есть способ, что я могу разделить это в одном пакете.

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

Я ценю любую информацию, которую любой может предоставить.

+1

Так что если у вас есть 'John A Smith III'? –

+0

Я не думал об этом, но это возможность, которую я не рассматривал. В этом случае A и III оба будут в конце с суффиксом, являющимся последним битом. | Джон | Смит А III |. –

+1

Работа с производными столбцами или скриптом - оба подхода описаны [здесь] (http://social.msdn.microsoft.com/Forums/sqlserver/en-US/2eb394d0-2cd8-4402-9bb4-14a03ccc4460/split -flat-file-column-data-into-multiple-columns-using-ssis) –

ответ

1

Имена парсинга удивительно сложны из-за многочисленных вариаций даже в одной культуре, как вы уже определили. Если вы можете вернуться к исходным данным, из которых CSV сгенерировал и извлечь эту информацию, тогда это было бы предпочтительнее, но ...

Один из способов обработки этого - использовать несколько регулярных выражений в компоненте скрипта. Каждое регулярное выражение будет отвечать за выбор части имени, которое вы позже сможете объединить, как вам нравится.

Попробуйте что-то вроде этого, вам, возможно, придется подстроить регулярное выражение, они определенно не самые сильные точки, и со временем вы можете найти случаи, которые не подходят, но это дает вам начало.

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    const string pFirstName = @"^[A-Z]([-']?[a-z]+)*"; 
    const string pSuffix = @"((Jr|Sr|I|V|X)(?))*"; 
    const string pInitial = @"(?<=\s)[A-Z](?=\s)"; 
    const string pLastName = @"(?!(?:Jr|Sr|I|V|X|^))([A-Z][-'\s]?[a-z]+)"; 

    string fullName = Row.Name.ToString(); 
    string firstName = Regex.Match(fullName, pFirstName).Value; 
    string suffix = Regex.Match(fullName, pSuffix).Value; 
    string initial = Regex.Match(fullName, pInitial).Value; 
    string lastName = Regex.Match(fullName, pLastName).Value; 

    if (!string.IsNullOrEmpty(initial)) 
     lastName += " " + initial; 

    if (!string.IsNullOrEmpty(suffix)) 
     lastName += " " + suffix; 

    Row.FirstName = firstName; 
    Row.LastName = lastName; 
} 

Edit: я сделал простой проект записи демо выше и показаны все три формы компонента сценария, вы можете загрузить его here

+0

TI, спасибо за ответ. Я новичок в компоненте Script, поэтому, пожалуйста, простите меня за последующий вопрос. –

+0

TI, Спасибо за информацию. Я никогда не использовал компонент скрипта, где бы я ввел эту информацию. Посмотрев на него, я бы взял кнопку «Редактировать сценарий», а затем заменил base.PreExecute(); со сценарием выше. Затем удалите все остальное. Если я ошибаюсь, дайте мне знать. –

+0

ОК, выяснил некоторые из того, что я делал неправильно, посмотрев ссылку, предоставленную Mr.Reband. Я пошел на выход и добавил ему имя FirstName и LastName. Теперь все красные squiggles исчезли, за исключением одного. «Пустота» на публике отменяет пустоту. Любая идея почему? –