【问题标题】:Excel non-uniform data extractionExcel非均匀数据提取
【发布时间】:2016-06-17 23:34:31
【问题描述】:

我很难找到解决方案——尽管我确信它就在那里。只是不确定确切的措辞来得到我正在寻找的东西。

我有一个庞大的数据集,其中一些数据缺少信息,因此不统一。我只想将名称提取到一列,将电子邮件提取到下一列。

缩小范围的最佳方法是在每个唯一条目之间留一个空格,并且名称始终位于第一个框中。

例子:

约翰·多伊
约翰·多伊的公司
(555) 555-5555
John.doe@johndoe.com

约翰·多伊
(555) 555-5555

约翰·多伊
Jane Doe 的公司
John.doe@johndoe.com

想要的结果是(在两个 excel 列中):

约翰·多伊 | john.doe@johndoe.com
约翰·多伊 |
约翰·多伊 | john.doe@johndoe.com

任何有关执行此操作的最佳方法的建议将不胜感激。如果没有电子邮件,为了让事情变得复杂,我想完全忽略该设置,但我可以手动检查。

【问题讨论】:

  • 建议您导出为 CSV,然后编写一个相当简单的 python 程序来读取 CSV 并生成您需要的输出。我确信在使用 VBA 的 Excel 宏中也可以使用,

标签: excel excel-formula vba


【解决方案1】:

VBA 编码:
1. 在第 1 行中指明数据开始的初始行。
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

【讨论】:

  • 做到了!这里和那里有点乱,但似乎是一些数据与设置方式的问题。我用搜索和替换删除了所有电话号码,结果它变得更干净了(我认为这与他们中的一些人的名字下有 7-8 行有关?)无论哪种方式,它都变得如此干净,我可以在几分钟内手动修复几个奇怪的错误。
【解决方案2】:

提取电子邮件地址应该不会太难,因为您只需要搜索包含@ 字符的字符串。可以使用一系列 search() 和 mid() 函数来分离单个单词。搜索空间的每个实例并在 mid() 函数中使用该值。然后在结果中搜索@,您应该会找到电子邮件地址。如果原始数据非常混乱,提取名称会更加困难。

但是,我赞同上面关于使用外部脚本的评论,尤其是对于大型数据集。 Excel 并不是真正为您在此处描述的那种东西而设计的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2018-02-06
    • 1970-01-01
    • 2011-07-05
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多