如何在Excel中根据IP地址查找位置

Posted

技术标签:

【中文标题】如何在Excel中根据IP地址查找位置【英文标题】:How to find location based on IP address in Excel 【发布时间】:2014-07-31 19:25:48 【问题描述】:

我有一个包含大约 5000 个与 IP 相关的用户事件的电子表格,我正在尝试使用 IP 来确定位置,只使用 Excel 公式。我日志中的 IP 结构为 "dotted quads"(十进制表示法)。

我认为 VLOOKUP 是通往这里的路,所以我下载了WEBNet77's IPV4 IpToCountry database,这似乎是一个全面且最新的资源(是否有更好的资源用于此目的?)。该数据库包含大约 140K 行 IP 范围,表格的结构如下:

列标签 A - G 分别为:IP FROM、IP TO、REGISTRY、ASSIGNED、CTRY、CNTRY、COUNTRY。

注意,一个问题:A 到 B 列代表一个 IP 范围,但它们是“长格式”(我一开始没有意识到这一点)。所以,在使用这些值作为参考之前,我必须转换我的虚线四边形。然后,我想为我的日志中的每个 IP 返回 Country(G 列)。

这里有什么帮助吗?

如果您认为有更好的方法来查找 IP > Excel 中的国家/地区(可能使用网络,即http://api.hostip.info/flag.php?ip=xxx.xxx.xxx.xxx),请告诉我。

【问题讨论】:

仅供参考:有类路由(A、B 和 C 类网络)已在 1993 年被替换。IP 地址块不再基于类。 @SanderSteffann 感谢您的来信。我已经相应地更新了问题。 【参考方案1】:

我还需要从我们网站访问者的 IP 中找到国家/地区名称,以便进行一些数据分析。为此,我在网络上使用了批量转换器,例如:

http://software77.net/geo-ip/multi-lookup/ https://www.infobyip.com/ipbulklookup.php

这些工具很不错,但它们允许您查找最大值。一次 500 个项目的数量。因此,您可以做的是批量运行数据。 (我猜他们有付费服务,允许一次查找更多的项目但没有尝试)

我是 excel 专家。所以我认为应该有一种简单的方法(某种模式或公式)将这些范围转换为国家。并为我们自己的内部使用构建了一个工具。最近决定发布它,你可以在这里查看: IP to Country Converter Excel Template

这是一个付费工具,所以我不想在这里推销它。但是您可以自己构建一个:

基本上,它运行一个 VBA 宏将 ip 地址转换为数值,并根据国家范围找到合适的匹配项。如果你熟悉 VBA,循环是这样的:

Dim dta() As Variant
dta() = Range("IP_List").Value

Dim arr() As Variant
Dim arr_v6() As Variant

arr() = Range("IP_v4").Value
arr_v6() = Range("IP_v6").Value

'generate IPV4 according to pattern 1.2.3.4 = 4 + (3 * 256) + (2 * 256 * 256) + (1 * 256 * 256 * 256)

For i = 1 To UBound(dta)

If InStr(1, dta(i, 1), ".") > 0 Then
spl = Split(dta(i, 1), ".") 'split IP in 4 integers

ip_converted = spl(3) + (spl(2) * 256) + (spl(1) * 256 * 256) + (spl(0) * 256 * 256 * 256)

'loop through array and find the country

rw = 0
rw = Application.WorksheetFunction.Match(ip_converted, Range("IP_v4"), 1)
If rw > 0 Then
dta(i, 2) = Range("V4_Country").Cells(rw, 1)
GoTo skip:
End If

这真的让我的日常生活变得轻松了。所以我建议要么使用服务,要么使用类似的模板。

【讨论】:

【参考方案2】:

您可以使用此函数将四元 IP 转换为数字

Function GetNumericIP(quadIP As String) As Long

    Dim sections
    On Error Resume Next
    sections = Split(quadIP, ".")

    GetNumericIP = sections(3) * 256 ^ 0 + sections(2) * 256 ^ 1 + sections(1) * 256 ^ 2 + sections(0) * 256 ^ 3
End Function

您可以使用 MATCH/INDEX 来获取您的位置。诀窍是让您的IP TO 列按升序排序。 Match 函数将返回该范围内小于给定值的最后一个值的行索引。

57.182.90.111  your input
968252015      =GetNumericIP(A1)
France         =INDEX(Country,MATCH(J6,IPTO,1)+1)
  (Or alternatively) =INDEX(Country,MATCH(J6,IPFROM,1))

请注意,我必须导入 CSV(不仅仅是在外部引用它)并将列转换为命名范围(CountryIPTO)。对于其他人的信息,问题中链接的 CSV 的列名称为:

IP 来自 IP 到 注册表 已分配 CTRY CNTRY 国家

或者,您可以仅使用公式将您的虚线四边形 IP 转换为其组成部分,但这有点麻烦。这是前两个部分(我的IP在I5

=LEFT(I5,FIND(".",I5)-1)
=LEFT(RIGHT(I5,LEN(I5)-I10),SEARCH(".",RIGHT(I5,LEN(I5)-I10))-1)

你可以看到......有点痛苦。更简单:使用上面解释的 VBA 方法,或者使用 Text to Columns(在功能区上:数据 > 数据工具 > 文本到列 > 分隔 > 下一步 > 其他:“。” > 下一步 > 完成)。然后编写一个公式,将您的拆分点分四组 IP 转换为参考数据库中的 IP 格式。这个公式有效:

=sumproduct(J5:M5, 256^3,2,1,0)

请记住在您的列范围中为上面的J5:M5 分项。然后针对新值运行 MATCH/INDEX。

【讨论】:

哇,我没有意识到数据库中的这些范围不是去点 IP;它们是转换为十进制的 IP。 但我想知道是否可以在没有 VBA 的情况下将点分 IP 转换为十进制。有什么想法吗? @SamtheBrand 查看我的编辑。是的,它可以在没有 VBA 的情况下完成 谢谢@brad,我做到了。现在挂断了转换为十进制。出于某种原因,我的公式 =sumproduct(J5:M5, 256^3,2,,0)` 在某些单元格中有效,但在其他单元格中无效。嗯。 您是否缺少1=sumproduct(J5:M5, 256^3,2,1,0)

以上是关于如何在Excel中根据IP地址查找位置的主要内容,如果未能解决你的问题,请参考以下文章

如何修改excel的ip

如何在 Python 中使用 IP 地址查找位置?

我可以使用哪些服务来根据 IP 地址查找用户的位置?

根据ip地址查找其端口在CISCO交换机中的位置

如何在不使用 API 的情况下查找 IP 地址的位置?

在表格中批量查询IP地址归属地