2013-06-27 21 views
2

兩列,我與SQL Server 2012和Visual Studio 2010的工作與Excel 2007拆分一個名稱列到使用SSIS

我建立一個包,從.CSV文件中提取信息,並將其導入到表在我們爲HRIS項目創建的數據庫中。

.CSV文件具有開始在B9和通過J列運行(行長度可能會有所不同)

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

我的問題是,我需要採取的Name列,並將其分割成以下字段FirstNameLastName列。我搜索了互聯網,發現了許多論壇,詳細介紹了使用派生列,條件拆分,腳本組件和MultiCast的方法。他們都沒有幫助或符合我的需求。

這個問題很複雜的名稱安排。我有三種可以顯示的不同名稱類型。

John Smith 
John A Smith 
John Smith III 

最後兩個他們將需要以不同的方式分割。

如果有一箇中間的初始值,他們希望這樣分割。

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

即史密斯和中間初始將在LastName

如果他們有後綴那麼他們將需要分割爲這樣。

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

即史密斯和後綴將在LastName

我需要知道,如果有,我可以在一個包拆分此出路。

最終這將自動運行每天,所以我也將不得不利用查找我假設篩選出任何重複項,只輸入新的數據。

我很欣賞任何人都可以提供的信息。

+1

所以,如果你有'約翰·史密斯III'? –

+0

我沒有想到那個,但那是我沒有考慮過的可能性。在這種情況下,A和III都將以最後一位的後綴結尾。 |約翰|史密斯A III |。 –

+1

派生列或腳本任務將工作 - 兩種方法概述 [here](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

Parseing名字是出奇的困難,因爲即使只是一個單一的文化的許多變化,因爲你已經確定。如果你可以從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; 
} 

編輯:我做了一個簡單的項目demoing以上,並顯示所有三種形式的腳本組件,你可以下載它here

+0

TI,謝謝你的迴應。我是腳本部分的新手,請原諒我後續問題。 –

+0

TI,感謝您的信息。我從來沒有使用腳本組件,我會在哪裏輸入這些信息。看着它,我會假設「編輯腳本」按鈕,然後取代base.PreExecute();與上面的腳本。然後刪除一切。如果我錯了,請告訴我。 –

+0

好吧,通過查看Mr.Reband提供的鏈接,找出了我做錯的一些事情,我去了輸出並添加了FirstName和LastName。現在,除了一個之外,所有的紅色波浪都消失了。公衆的「無效」覆蓋無效。任何想法爲什麼? –