我很难找到解决方案 - 尽管我确信它已经存在了。只是不确定准确的措辞来获得我正在寻找的东西。
我有一个巨大的数据集,其中一些数据缺少信息,所以它不统一。我想只将名称提取到一列,然后将电子邮件提取到下一列。
我可以缩小范围的最佳方法是每个唯一条目之间都有一个空格,名称始终位于第一个框中。
示例:
John Doe
John Doe的公司
(555)555-5555
John.doe@johndoe.com
John Doe
(555)555-5555
John Doe
Jane Doe的公司
John.doe@johndoe.com
结果需要(在两个excel列中):
John Doe | john.doe@johndoe.com
John Doe |
John Doe john.doe@johndoe.com
任何有关最佳方法的建议都将受到赞赏。如果没有电子邮件会使其变得复杂,我会想完全忽略该设置,但我可以手动检查。
答案 0 :(得分:0)
提取电子邮件地址应该不会太困难,因为您只需要搜索包含@字符的字符串。可以使用一系列search()和mid()函数来分离单个单词。搜索空间的每个实例并在mid()函数中使用该值。然后在结果中搜索@,您应该找到电子邮件地址。如果原始数据非常混乱,提取名称会更加困难。
然而,我在上面关于使用外部脚本的评论,尤其是对于大型数据集。 Excel并不是真的设计用于你在这里描述的那种东西。
答案 1 :(得分:0)
VBA编码:
1.在Row1中指示数据开始的第一行
2.在这种情况下放置一个标志“" end"表示信息的结束。
3.创建第二张表
Sub ToList()
Row1 = 1 'Row initial from data
Row2 = 1 'Row initial to put list
Do
Name = False
Do
field = Trim(Sheets(1).Cells(Row1, 1))
If field <> "" And LCase(field) <> "end" And Not Name Then
Sheets(2).Cells(Row2, 1) = field
Name = True
End If
Row1 = Row1 + 1
Loop Until (IIf(field = "" Or LCase(field) = "end", True, False))
fieldprev = Sheets(1).Cells(Row1 - 2, 1)
If InStr(fieldprev, "@") > 0 Then
Sheets(2).Cells(Row2, 2) = fieldprev
End If
Row2 = Row2 + 1
Loop Until (IIf(LCase(field) = "end", True, False))
End Sub