0

我有一栏。在该列中保存了一个人的全名(名字,姓氏)。有时它被保存为

Michael, Myers

有时名称会像这样保存

Michael Myers

它们之间没有逗号。

如果我加载该列并将其保存到一个变量中,它当然看起来像:Michael, MyersMichael Myers

问题是:如果我从数据库中加载列,如何将名字和姓氏彼此独立地保存在不同的变量中。

4

4 回答 4

2

这是一场数据噩梦。我强烈建议在源头更正此问题(使用两个单独的列)并在可能的情况下修复一次数据。

假设它不是(或现在不是):

通过尝试查找逗号并根据结果使用分支逻辑,您将得到大多数情况。但是,有许多边缘情况需要考虑。一种方法的概要是

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 这样的单逗号大小写的问题。更完整的逻辑将测试这种情况。

当存在某种名称后缀时,您可能会在 Last, First 格式中遇到 2 个(或更多)逗号的情况。您将不得不决定花多少时间来清理那里的逻辑。就我个人而言,我倾向于记录几个月内发生的所有情况,以发展我的逻辑。

几年前我使用了一个产品,它很好地从自由格式的字段中提取名称并整理出名字、姓氏等。可能值得一看

于 2012-11-19T22:18:17.977 回答
1

的可能值是fullname多少?鉴于你上面的例子,除了像下面这样的蹩脚的东西之外,没有好的、一致的方法可以将两者分开:

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

您可以对“,”进行字符串拆分。然后另一个字符串在“”上拆分。这将确保您已经涵盖了这两种情况。

但是,您真正想要做的是用一个大的木制物体击中您的 DBA,以便将两列塞进一个。

于 2012-11-19T22:19:30.793 回答
0

正如其他人所说,用逗号分割是微不足道的。真正的问题是你不知道还有多少口味会出现。如果只有这两个

以下假设 sql server 是您的数据库,例如

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 回答