我有一栏。在该列中保存了一个人的全名(名字,姓氏)。有时它被保存为
Michael, Myers
有时名称会像这样保存
Michael Myers
它们之间没有逗号。
如果我加载该列并将其保存到一个变量中,它当然看起来像:Michael, Myers
或Michael Myers
。
问题是:如果我从数据库中加载列,如何将名字和姓氏彼此独立地保存在不同的变量中。
这是一场数据噩梦。我强烈建议在源头更正此问题(使用两个单独的列)并在可能的情况下修复一次数据。
假设它不是(或现在不是):
通过尝试查找逗号并根据结果使用分支逻辑,您将得到大多数情况。但是,有许多边缘情况需要考虑。一种方法的概要是
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 个(或更多)逗号的情况。您将不得不决定花多少时间来清理那里的逻辑。就我个人而言,我倾向于记录几个月内发生的所有情况,以发展我的逻辑。
几年前我使用了一个产品,它很好地从自由格式的字段中提取名称并整理出名字、姓氏等。可能值得一看。
的可能值是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.
}
您可以对“,”进行字符串拆分。然后另一个字符串在“”上拆分。这将确保您已经涵盖了这两种情况。
但是,您真正想要做的是用一个大的木制物体击中您的 DBA,以便将两列塞进一个。
正如其他人所说,用逗号分割是微不足道的。真正的问题是你不知道还有多少口味会出现。如果只有这两个
以下假设 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。