使用SSIS将一个名称列拆分为两列

时间:2013-06-27 19:51:06

标签: sql sql-server ssis sql-server-2012

我正在使用Excel 2007与SQL Server 2012和Visual Studio 2010合作。

我正在构建一个包,它将从.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  |

即。 Smith和Middle Initial将位于LastName

如果他们有后缀,那么他们将需要分开。

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

即。 Smith和后缀将位于LastName

我需要知道是否有一种方法可以将其拆分出来。

最终这将自动运行以便每天运行,因此我还必须利用我认为可以过滤掉任何重复项并仅输入新数据的查找。

我感谢任何人都可以提供的任何信息。

1 个答案:

答案 0 :(得分: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;
}

编辑:我做了一个简单的项目演示上面的内容并显示了脚本组件的所有三种形式,你可以下载它here