纯真ip地址数据处理到postgresql数据库

想自己处理网站访问log的ip地址统计分析,因此需要国内用户的ip地址分布,这个可以用纯真ip数据库来进行处理。

1. 下载安装纯真ip数据库

下载地址:纯真ip数据库

纯真ip数据库只支持windows平台,因此需要在虚拟机里进行安装。安装完成后可以选择数据库的导出(导出为文本格式)。

这个导出的文本格式还有点诡异,不能用iconv直接转换编码,最终是用windows下的一个emeditor文本编辑软件进行编码的转换,转换为utf8格式的。

2. 数据格式处理

因为最终是要导入到postgresql数据库中,所以要对导出的utf8文本进行处理,主要是格式上的要求,如常见的csv格式等。

导出的文本格式为:

ip1  ip2  district line

其中主要的分割是空格,但line中自身也包含空格信息。

处理过程如下。

替换空格为分号,在vi中可以如此处理:

:% s/\s\+/;/g

这样做的后果就是将line中的空格也替换成分号了,因此需要再替换回来:

:% s/\(;.\{-}\)\(;.\{-}\)\(;.\{-}\);/\1\2\3 /g

这个命令的主要作用就是将第四个分号替换为空格。因此本命令需要执行多次,直到最终无可替换文本为止。

部分ip地址缺少line属性,因此还需要添加一个空白的文本,否则在导入的时候会出错:

:% s/\([0-9];CZ88\.NET\)$/\1;/g

此命令的作用就是在只有2个分号的地方增加一个结尾分号,即行中以CZ88.NET为结尾,且其前不为ip地址(数字)。
3. 导入到数据库
在数据库中建立一个对应的table,如

CREATE TABLE ipaddress
 (
 id serial NOT NULL,
 district character varying,
 line0 character varying,
 ipstart inet NOT NULL,
 ipend inet NOT NULL,
 CONSTRAINT ipaddress_pkey PRIMARY KEY (id ),
 CONSTRAINT ipaddress_ipstart_key UNIQUE (ipstart )
 );

我在建表的时候首先选择ip地址的字段是文本类型的,然后再转换为inet类型的。即通过sql命令导入:

  copy ipaddress (ip0,ip1,district,line0) from 'ip.txt' delimiter ';'

这样导入后在转换为inet类型:

  update ipaddress set ipstart=inet(ip0),ipend=inet(ip1)

这样就可以利用这个ipaddress表进行相关的查询了。


已发布

分类

来自

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注