Need name extraction function?

I need some functions that will take a person's full name as a string, and attempt to extract the various piecces of it, i.e.:

GetFirstName(), GetNamePrefix(), GetMiddleName(), GetNameSuffix()

What I would pass in would be something like:
John Doe
Dr. Alvin Chipmunk Ph.D.
Miss Mary Kate O'Reily
Mr. Alberto Juan De Laurentis

I was hoping that there might be some functions out there already to handle this so I wouldn't have to re-invent the wheel? I'll take code in either C# or VB.NET, or whatever really, as long as it can be converted to .NET of some sort.
LVL 8
toddhdAsked:
Who is Participating?
 
Jaime OlivaresConnect With a Mentor Software ArchitectCommented:
toddhd,
I have been there.
A possible approach is to make a semi-automated migration, one-by-one. Create a migration application where you suggest an interpretation and let user to choose a name structure, some UI with radio buttons  like (using Jim's example):

Full Name: Dr. Ralph Waldo Emerson III Esq., PhD, MD
 
Please correct name structure, if needed:
Dr.      (x) Prefix, ( ) First, ( ) Middle, ( ) Last, ( ) Postfix 
Ralph    ( ) Prefix, (x) First, ( ) Middle, ( ) Last, ( ) Postfix 
Waldo    ( ) Prefix, ( ) First, (x) Middle, ( ) Last, ( ) Postfix
Emerson  ( ) Prefix, ( ) First, (x) Middle, ( ) Last, ( ) Postfix 
III      ( ) Prefix, ( ) First, ( ) Middle, (x) Last, ( ) Postfix
Esq.     ( ) Prefix, ( ) First, ( ) Middle, ( ) Last, (x) Postfix
PhD      ( ) Prefix, ( ) First, ( ) Middle, ( ) Last, (x) Postfix
MD       ( ) Prefix, ( ) First, ( ) Middle, ( ) Last, (x) Postfix

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
Is is not as easy. Consider this case:
Juan Marcelo Menotti
How you will know if Marcelo is the Middle Name or it is the second first name?
A dictionary will be useless.

You can try to attack the problem by a different side. Store the name components separately:


class PersonName
{
    string Prefix;
    string FirstName;
    string MidName;
    string LastName;
    string Suffix;
 
    public string GetFirstName() { return FirstName; }
    public string GetMiddleName() { return MidName; }
    public string GetLastName() { return LastName; } 
    // etcetera
 
    public override string ToString()
   {
         StringBuilder sb = new StringBuilder();
         if (!string.IsNullOrEmpty(Prefix))
               sb.Append(Prefix+" ");
         if (!string.IsNullOrEmpty(FirstName))
               sb.Append(FirstName+" ");
         if (!string.IsNullOrEmpty(MidName))
               sb.Append(MidName+" ");
         // etcetera
    }
}

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
sorry, ToString method should end with:

    return sb.ToString();
}
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
toddhdAuthor Commented:
jaime,
I agree with you approach completely, but I just dont have that luxury :)
I have a client (a bank no less) that has some very old data in a database where the names have been entered as one long string, and well - you guessed it, they want to get the data back out.
I am working on my own function, and made up a list of prefixes I know of to check against. Postfixes are tougher as they are practically limitless, and some have periods (Ph.D., Sr. D.D.S) and some don't (such as roman numerals). At some point, I just have to make an educated guess.

The first/last name thing is an issue with non-American names, and middle names can get out of hand sometimes as well, since there can be multiple ones.
0
 
JimBrandleyCommented:
I would start with a split on blanks. You can deduce some of the structure by knowing the number of elements in the name.
string fullName = "Dr. Ralph Waldo Emerson III Esq., PhD, MD";
string[] elements = fullName.Split(' ');

Jim
0
 
toddhdAuthor Commented:
jaime, I'm just going to award you the points. While it's not an exact answer, it at least tells me that I'm on the right track with what I'm doing, and that no pre-written methiod exists to do this. I'll have to post my code somewhere once I'm done so other people can use it i nthe future :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.