【问题标题】:Clean up domain list in Excel - regex / macros?清理 Excel 中的域列表 - 正则表达式/宏?
【发布时间】:2015-09-11 13:05:09
【问题描述】:

我有一个庞大的域电子表格,我需要清理如下:

  1. 删除所有http://(简单地全部替换-将“http://”替换为“”)
  2. 删除任何www.(简单地全部替换-“www.”替换为“”)
  3. 删除所有子域(完全删除实际行,而不仅仅是 url 中的子域)
  4. 删除域扩展后的任何内容(即website.com/blah/blahbah/ 变为 website.com(简单地将所有 - "/*" 替换为 "",然后将所有 "/" 替换为 ""

所以我剩下的只是一个干净域的电子表格,比如"website.com"

我认为我已经对 1、2 和 4 进行了排序(如上),但我真的很难处理 3

有什么想法吗?我可以使用 / 执行此操作,并且实际上完全删除该行吗?

样本数据:

http://www.scholastic.com/kids/stacks/games/
http://imgworld.teamworkonline.com/
http://topfreegraphics.com/
http://www.workcircle.co.uk/
http://www.healthycanadians.gc.ca/index-eng.php
http://gsociology.icaap.org/methods/soft.html

帖子 1、2 和 4 会给我留下:

scholastic.com
imgworld.teamworkonline.com
topfreegraphics.com
workcircle.co.uk
健康加拿大人.gc.ca
gsociology.icaap.org

我需要完全删除那些讨厌的子域,只需删除该行即可。我已经意识到我不能只搜索 2 x ".",因为显然很多域扩展名(即.co.uk)都包含它。

任何帮助表示赞赏。

【问题讨论】:

  • 你可以遍历你的数据,确实检查 double 。并删除当前行(宏)
  • 如果您需要具体帮助,请向我们展示一些真实数据(例如截图)和预期输出以及您迄今为止尝试过的内容以及您的问题。这样,您将获得真实而准确的答案。
  • 对不起伙计们,添加了示例数据以及到目前为止我是如何实现的。
  • 谢谢蒂姆,好多了。虽然很棘手 - 除非在某个地方有有效域扩展的主列表,否则我认为你最好的选择是验证可能的通过(.co.xx.com.xxx 等),然后在文件中列出其余部分以供手动检查
  • 谢谢布雷特,听起来很痛苦...电子表格中有 150,000 个域!

标签: regexp vba regex excel vba dns


【解决方案1】:

如果您可以找出在第三步中使用哪个,那么一旦您适当地调整了范围,以下代码将完成您需要它做的事情。

Private Sub xlRegexp()

Dim c As Integer
Dim n As Integer
Dim strOldText As String
Dim RegExFindThis As String
Dim RegEx
Set RegEx = CreateObject("vbscript.regexp")

c = 1

WhichCase:

 Select Case c
    Case 1    
        RegExFindThis = "http://"    
    Case 2    
        RegExFindThis = "www."    
    Case 3    
        RegExFindThis = "/.*"    
    Case Else    
        GoTo Subdomains    
End Select

With RegEx
    .Pattern = RegExFindThis
    .Global = True
End With

For n = [X] To [Y]
    Range("A" & n).Activate 'assumes your list is in column A
    strOldText = ActiveCell.Text
    ActiveCell.Value = RegEx.Replace(strOldText, "")
Next

c = c + 1

GoTo WhichCase
Subdomains:

RegExFindThis = "[STEP 3 RegExp]"

With RegEx
    .Pattern = RegExFindThis
    .Global = True
End With

n = 1

For n = [X] To [Y]
    Range("A" & n).Activate 'assumes your list is in column A
    If RegEx.Test(ActiveCell.Text) Then
        Rows(ActiveCell.Row).Select
        Selection.Delete Shift:=xlUp
    End If
Next

Set RegEx = Nothing
MsgBox ("Macro complete.")
End Sub

【讨论】:

    【解决方案2】:

    作为一个非常简单的方法:

    for i = worksheet.rows.count to 1 step -1
    Dim counter as Integer
    Dim Value as String
    Dim splitter as String()
    Value = worksheet.cells(i,1).value
    Dim splitter() As String
    splitter=split(Value,".")
    
    if ubound(splitter)>1 then
    workseet.rows.removeat(i)
    end if
    next
    

    可能无法开箱即用,因为没有数据可以对此进行测试,但它应该可以正常工作...

    【讨论】:

      【解决方案3】:

      快速而肮脏的解决方案。

      =IF(ISERROR(FIND(".",A1,FIND(".",A1,1)+1)),"",IF(ISERROR(MATCH(RIGHT(A1,LEN(A1)-FIND(".",A1)),$D:$D,0)),"Subdomain",""))
      

      A 列:域列表。
      D 列:接受的子域记录列表(gov.uk 等),由用户编制。

      也适用于具有 3 个或更多点的域。

      之后可以过滤掉子域单元格并删除。

      【讨论】:

      • 感谢 Juri,这看起来不错,我会试一试并报告。
      • -他说,4 年前
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2014-04-18
      • 1970-01-01
      • 2010-11-27
      • 2010-12-31
      相关资源
      最近更新 更多