我正在制作一个应用程序,它正在读取包含客户信息的excel文件,并将此数据推送到SQL数据库中。问题是原始设计师不是使用列来存储customer name
,customer phone
,secondary contact name
和secondary contact phone
,而是将它们全部放在一个长句中单列。
我的计划是从条目中删除所有空格和非字母数字字符,所以我基本上得到一个长字符串,其中最长的字符串可能是这样的
JeffSmith07621589641SarahSmith09854315741
我打算使用正则表达式拆分名称和数字(并进一步将名称再次拆分为第一个/最后一个)。我一直在尝试像这样的regex.split
String[] splitArray = Regex.Split("JeffSmith07621589641SarahSmith09854315741",
@"(?<=[a-zA-Z])(?=\d)");
我希望得到4个元素,但我的结果却是这样的
stringArray[0] = JeffSmith
stringArray[1] = 07621589641SarahSmith
stringArray[3] = 09854315741
正如您所看到的,我没有从第一个电话号码,第二个名称中分离出来。
提取数据的最佳方法是什么?
如果它是一个正则表达式,为了实现我正在寻找的东西,需要添加到正则表达式中需要什么?
正则表达式很慢,我在Excel文件中处理了大约4000条记录。
答案 0 :(得分:3)
雅,为另一种可能性做同样的事情。即,也匹配数字和字母之间存在的边界。目前,您的正则表达式仅匹配字母和数字之间存在的边界。
String[] splitArray = Regex.Split("JeffSmith07621589641SarahSmith09854315741", @"(?<=[a-zA-Z])(?=\d)|(?<=\d)(?=[a-zA-Z])");
答案 1 :(得分:2)
或者你可以把它们放到这样的实体中:
var text = "JeffSmith07621589641SarahSmith09854315741";
var pattern = @"(?<Name>[^\d]+)(?<Number>\d+)";
var entities =
Regex.Matches(text, pattern)
.OfType<Match>()
.Select(mt => new
{
Name = mt.Groups["Name"].Value,
Phone = mt.Groups["Number"].Value,
});
结果
如果他们遵循大写后跟小写的模式,则获取名字和姓氏:
var pattern = @"(?<First>[A-Z][a-z]+)(?<Last>[^\d]+)(?<Number>\d+)";
var entities =
Regex.Matches(text, pattern)
.OfType<Match>()
.Select(mt => new
{
NameFirst = mt.Groups["First"].Value,
NameLast = mt.Groups["Last"].Value,
Phone = mt.Groups["Number"].Value,
});
更新以首先整理Excel
发现一些名称条目完全是小写的
我建议您在创建错误记录列表之前更改Excel中的文本。执行这些步骤