2

SQL Server 2012 および Visual Studio 2010 と Excel 2007 を使用しています。

.CSVファイルから情報を取得し、HRIS プロジェクト用に作成している DB のテーブルにインポートするパッケージを作成しています。

この.CSVファイルには、B9 から始まり、列 J まで続く次のフィールドがあります (行の長さは異なります)。

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

私が抱えている問題は、列を取得してそれを aと列Nameに分割する必要があることです。私はインターネットを精査し、派生列、条件付き分割、スクリプト コンポーネント、およびマルチキャストを使用する方法を詳述するフォーラムを多数見つけました。それらのどれも役に立たなかったり、私のニーズに合ったりしませんでした。FirstNameLastName

この問題は、名前の配置によって複雑になります。表示できる名前の種類は 3 つあります。

John Smith
John A Smith
John Smith III

最後の 2 つは別の方法で分割する必要があります。

中間のイニシャルがある場合は、そのように分割する必要があります。

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

つまり、Smith とミドル イニシャルがLastName列に表示されます。

接尾辞がある場合は、そのように分割する必要があります。

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

つまり、Smith と接尾辞がLastName列に表示されます

これを 1 つのパッケージに分割できる方法があるかどうかを知る必要があります。

最終的に、これは毎日実行されるように自動化されるため、重複を除外して新しいデータのみを入力すると想定するルックアップも利用する必要があります。

誰でも提供できる情報に感謝します。

4

1 に答える 1

1

名前の解析は、すでに特定したように、単一の文化だけでも多数のバリエーションがあるため、驚くほど困難です。CSV が生成された場所からソース データに戻り、この情報を抽出できる場合は、それが望ましいですが...

これを処理する 1 つの方法は、スクリプト コンポーネントで複数の正規表現を使用することです。各正規表現は、後で好きなように連結できる名前の一部を選択する責任があります。

このようなことを試してみてください。正規表現を微調整する必要があるかもしれません。それらは間違いなく私の強みではありません。時間が経つにつれて、適合しないケースが見つかるかもしれませんが、それはあなたにスタートを与えます.

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

編集: 上記のデモを行い、スクリプト コンポーネントの 3 つの形式すべてを示す簡単なプロジェクトを作成しました。ここからダウンロードできます。

于 2013-06-27T21:31:01.927 に答える