0

私は1つの列を持っています。その列には、人物のフルネーム (名、姓) が保存されます。のように保存されることもあります。

Michael, Myers

時には名前が次のように保存されます

Michael Myers

それらの間にコンマなし。

列をロードして変数に保存すると、もちろん次のようになりMichael, MyersますMichael Myers

質問は次のとおりです。データベースから列をロードする場合、姓と名を別々の変数に個別に保存するにはどうすればよいですか。

4

4 に答える 4

2

これはデータの悪夢です。ソースでこれを修正し (2 つの別々の列を使用)、可能であれば一度データを修正することを強くお勧めします。

そうではない(または今はそうではない)と仮定します。

カンマを探して、結果に基づいて分岐ロジックを使用するだけで、ほとんどの場合が正しくなります。ただし、考慮すべき多くのエッジ ケースがあります。1 つのアプローチの概要は次のようになります。

string[] parts = theColumn.Trim().Split(',');
if (parts.Length == 1)
{
    // Find the last occurrence of ' ' and split first/last name based on that
    // People may have middle names entered e.g. Michael M. Myers
}
else if (parts.Length == 2)
{
    firstName = parts[1];
    lastName = parts[0];
}
else
{
    // Dealing with a more complex case like Myers, Jr., Michael
    // You will have to develop logic for such special cases that may
    // be in your data.
}

Michael Myers, Jr. や Michael Meyers, DDS のような名前のコンマが 1 つのケースでは問題が発生します。このような場合は、より完全なロジックでテストできます。

ある種の名前接尾辞がある場合、Last, First 形式で 2 つ (またはそれ以上) のコンマが使用される場合があります。そこでのロジックのサニタイズにどれだけの時間を費やすかを決める必要があります。個人的には、私の論理を進化させるために、数か月間起こったすべてのケースを記録する傾向があります.

私は数年前に、自由形式のフィールドから名前を引き出し、名、姓などを整理するのに適した製品を使用していました。一見の価値あるかもしれません.

于 2012-11-19T22:18:17.977 に答える
1

の可能な値はfullname何ですか? 上記の例を考えると、次のような不自由なものを除いて、2つを分離するための適切で一貫した方法はありません。

string firstName;
string lastName;
if(fullname.Contains(","))
{
    string[] splitNames = fullName.Split(",");
    lastName = splitNames[0];
    firstName = splitNames[1];
}
else if(splitNames.Contains(" "))
{
    string[] splitNames = fullName.Split(" ");
    firstName = splitNames[0];
    lastName = splitNames[1];
}
else
{
    //Some other logic.
}
于 2012-11-19T22:20:22.680 に答える
0

他の人が言ったように、コンマで分割するのは簡単です。本当の問題は、あと何種類のフレーバーが出てくるかわからないことです。この二人だけなら

以下は、SQLサーバーがあなたのデータベースであると仮定しています。

Select 
Case 
 When CharIndex(',',[DaftNameField]) = 0 
 Then Substring([SomeNameField],CharIndex(',',[SomeNameField]),255)
else  Substring([SomeNameField],1, CharIndex(' ',[SomeNameField]) - 1)
end As Forename,
Case 
 When CharIndex(',',[SomeNameField]) = 0 
 Then Substring([SomeNameField],1 CharIndex(',',[SomeNameField]) - 1)
else  Substring([SomeNameField], CharIndex(' ',[SomeNameField]) + 1, 255)
end As Surname
From SomeTable

これは私の頭の上から外れていますが、基本的には正しいです。

既に痛々しいのがお分かりいただけると思いますが、ミドルネームや敬語などを入れるとさらに悪化します。

ああ、このテーブルにある種の PersonID があることを教えてください。

于 2012-11-19T22:38:46.277 に答える
0

「、」で文字列分割を行うことができます。次に、" " で別の文字列が分割されます。これにより、両方のケースを確実にカバーできます。

しかし、実際にやりたいことは、2 つの列を 1 つに詰め込むための大きな木製の物体で DBA を攻撃することです。

于 2012-11-19T22:19:30.793 に答える