2

我正在使用带有 Excel 2007 的 SQL Server 2012 和 Visual Studio 2010。

我正在构建一个包,该包将从.CSV文件中提取信息并将其导入我们为 HRIS 项目创建的数据库中的表中。

.CSV文件具有以下字段,从 B9 开始并贯穿 J 列(行长会有所不同)

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

我遇到的问题是我需要将Name列拆分为 aFirstNameLastName列。我搜索了互联网,发现许多论坛详细介绍了使用派生列、条件拆分、脚本组件和多播的方法。他们都没有帮助或满足我的需要。

名称安排使问题变得复杂。我可以显示三种不同的名称类型。

John Smith
John A Smith
John Smith III

最后两个他们将需要以不同的方式拆分。

如果有中间首字母,他们希望将其拆分。

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

即史密斯和中间名首字母将在LastName列中

如果它们有后缀,那么它们将需要被拆分。

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

即史密斯和后缀将在LastName

我需要知道是否有一种方法可以将其拆分为一个包。

最终,这将每天自动运行,因此我还必须使用我假设的查找来过滤掉任何重复项并仅输入新数据。

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

4

1 回答 1

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;
}

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

于 2013-06-27T21:31:01.927 回答