WEB开发网
开发学院数据库MSSQL Server 数据仓库项目中的IP转换成地区 阅读

数据仓库项目中的IP转换成地区

 2008-11-24 10:10:52 来源:WEB开发网   
核心提示: 在电子商务网站中,假如我们需要分析用户的地区的分布的时候,数据仓库项目中的IP转换成地区,虽然一般的网站都有记录用户所在省份和地区的字段,但是一般的网站都不会去核实用户的这些信息,然后导入到数据仓库中我的地区维度表,数据仓库中的地区维度的表结构如下:GeographyKey intProvince varch

在电子商务网站中,假如我们需要分析用户的地区的分布的时候,虽然一般的网站都有记录用户所在省份和地区的字段,但是一般的网站都不会去核实用户的这些信息,因此数

据的准确性就有比较大的偏差,甚至很多用户都不填写这个信息(如果不是必填项的话),那么这个时候用户注册时候的IP地址就显得可靠多了,但是要把IP地址转换成地区并

非易事,倒不是说这个技术很难实现,是因为IP分配规则太乱了,不象邮政编码或者区号那么定的那么死,所以这个就成为了一项比较浩大的工程。IP地址库有商业的可以购买

,也有免费的可以使用。我就是使用的广大网友经常使用的QQWry.Data 这个东东,我先叫人家把这里面的数据整理成我定好的格式(这是一项比较大的工程,3个人弄大概弄了2

天),然后导入到数据仓库中我的地区维度表。

数据仓库中的地区维度的表结构如下:

GeographyKey int
Province varchar(50)
City varchar(50)
IPSections text

我的源系统中的用户的表结构如下:

CustomerID varchar(50)
Account nvarchar(50)
RegisterTime datetime
IPAddress varchar(50)
UpdateTime datetime

数据仓库中的用户的表结构如下:

CustomerKey int
GeographyKey int
RegisterDateKey int
CustomerCodeAlternateKey varchar(50)
Account nvarchar(50)
IPAddress varchar(50)
RegisterTime datetime
UpdateTime datetime 

接下来还是使用我们的好帮手SSIS。

其中关键在于中间的那个脚本组件,里面包含一个类IPCompare

Code

Imports System
Imports System.Net
Public Class IPCompare
  Shared Function AreEqual(ByVal IPAddr1 As String, ByVal IPAddr2 As String) As Boolean
    Return IPAddressToLongBackwards(IPAddr1) = IPAddressToLongBackwards(IPAddr2)
  End Function
  Shared Function IsGreater(ByVal ToCompare As String, ByVal CompareAgainst As String) As Boolean
    Return IPAddressToLongBackwards(ToCompare) > IPAddressToLongBackwards(CompareAgainst)
  End Function
  Shared Function IsLess(ByVal ToCompare As String, ByVal CompareAgainst As String) As Boolean
    Return IPAddressToLongBackwards(ToCompare) < IPAddressToLongBackwards(CompareAgainst)
  End Function
  Shared Function IsGreaterOrEqual(ByVal ToCompare As String, ByVal CompareAgainst As String) As Boolean
    Return IPAddressToLongBackwards(ToCompare) >= IPAddressToLongBackwards(CompareAgainst)
  End Function
  Shared Function IsLessOrEqual(ByVal ToCompare As String, ByVal CompareAgainst As String) As Boolean
    Return IPAddressToLongBackwards(ToCompare) <= IPAddressToLongBackwards(CompareAgainst)
  End Function
  Shared Function LongToIPAddress(ByVal IPAddr As Long) As String
    Return New System.Net.IPAddress(IPAddr).ToString()
  End Function
  Shared Function IPAddressToLongBackwards(ByVal IPAddr As String) As Long
    Dim i As Integer
    Dim IpByte As String() = IPAddr.Split(New Char() {"."c})
    Dim nUpperBound As Integer = IpByte.GetUpperBound(0)
    If (nUpperBound <> 3) Then
      IpByte = New String(4 - 1) {}
      i = 1
      Do While (i <= (3 - nUpperBound))
        IpByte((nUpperBound + i)) = "0"
        i += 1
      Loop
    End If
    Dim TempByte4 As Byte() = New Byte(4 - 1) {}
    i = 0
    Do While (i <= 3)
      If IPCompare.IsNumeric(IpByte(i)) Then
        TempByte4((3 - i)) = CByte((Convert.ToInt32(IpByte(i)) And &HFF))
      End If
      i += 1
    Loop
    Return BitConverter.ToUInt32(TempByte4, 0)
  End Function
  Private Shared Function IsNumeric(ByVal str As String) As Boolean
    If (System.Text.RegularExpressions.Regex.IsMatch(str, "^-?d+$")) Then
      Return True
    End If
    Return False
  End Function
End Class

1 2  下一页

Tags:数据 仓库 项目

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接