标题: 批处理从纯真IP数据库内提取国内IP数据 [打印本页]
作者: namejm 时间: 2010-5-8 12:58 标题: 批处理从纯真IP数据库内提取国内IP数据
在CN-DOS看到了一个很好的应用话题,与头两天本论坛内整理手机号码数据库的话题有点类似,特转过来大家讨论一下。
以下是CN-DOS转过来的原文,略有改动和删节(原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=51160):
作者: namejm 时间: 2010-5-8 16:10
数据分析:
通观整个ip数据库的文本,发现数据库的格式为:第1和第2列分别为I起止IP、第3列为地理位置、第4列为公司/单位/网吧名称,可见,我们需要的是第1到第3列数据即可。
第1列和第2列数据是IP地址,可以不加处理;我们需要处理的是第3列的地理位置。
第3列数据的构成方式比较复杂,并且还有一些不规则的数据,其构成方式有如下几种:
1、普通省份:一般有“××省××市××县”、“××省××市”、“××省××县”这几种构成方式;例如:湖南省益阳市桃江县、四川省宜宾市、海南省陵水县;另有一些地名中“州”、“市”相连的,例如:福建省福州市、湖南省郴州市;还有更特别的,是市级“市”与县级“市”相连的,例如:浙江省台州市温岭市;
2、自治区:一般是“××××市”、“××××盟”、“××××××旗××镇”;例如:广西贵港市、内蒙古呼伦贝尔盟、内蒙古莫旗尼尔基镇;
3、直辖市:××市××区/县;例如:北京市朝阳区、北京市密云县;
4、特别行政区:香港、澳门;地名前后都带空格。
5、其他格式:常见于自治区类地名,例如:新疆大学软件学院机房A区、内蒙古农业大学。
如何处理地名数据?
既然地名数据是按照以上5种情况来构成的,那么,最好把地名写成与上述情况对应的4种配置文件(第5种可以合入第2种),分别保存,然后,用 findstr 命令读取不同的地名文件分别处理。
以下的地名提取思路基于 for 语句的分析:
1、对普通省份,可以直接以“省”字作为切分符号,分离出省名;省的下一级地名,有可能是市/州/地区名、也可能是县名,若直接以“市”、“州”、“县”作为切分符号,则会把“福州市”切分成“福”、“郴州市”切分成“郴”,把阿坝州的茂县切分成“阿坝”和“茂”,显然是不可取的切分方法,必须另辟蹊径;
2、对自治区的地名,自治区名无法直接切分出来,只能配合findstr语句,通过查询自治区名来感知当前提取的是哪一个自治区的地名;然后再用set语句把这个自治区的地名替换为空,进而获取自治区的下一级地名;当然,也可以把所有的自治区名都罗列出来,然后用 set 语句替换掉,但这样每一条地名都必须替换5次,显然效率不高;
3、直辖市很好办,通过读取地名配置文件,然后,直接在头两列填充直辖市名即可;
4、特别行政区也很好办,与上一条的处理基本相似。
需要注意的是:
提取整行内容一般用 findstr 来实现,但是它不能限制要查找的内容只在第3列上,例如,当查询“香港”时,有可能连“61.136.145.39 61.136.145.39 湖北省宜昌市 香港名店街天都网吧”这样的记录都查出来了,所以,需要对配置文件做一些特别的设置,以求查找的内容被限定在第3列上。
作者: namejm 时间: 2010-5-8 16:10
根据楼上的分析,得到如下代码:- @echo off
- md tmp 2>nul
- setlocal enabledelayedexpansion
-
- for /f %%i in ('dir /a-d /b .\config\*.txt') do (
- findstr /ig:".\config\%%i" ip.txt>.\tmp\%%~niIP.txt
- )
-
- md result 2>nul
-
- :: 整理省份IP数据
- :: “省-市(州/地区)”、“省-市(州/地区)-县”格式的取到市/州/地区;
- :: “省-县(市)”格式的取到县/市;
- :: 若按前面的规则取到的最后一级地名为单字的,考虑到单名难以确定地名,将直接取省名
- :: 需要处理类似“云南省楚雄州楚雄市”这样的地名
- (for /f "tokens=1-3" %%i in (.\tmp\省IP.txt) do (
- for /f "delims=省市县 tokens=1,2" %%x in ("%%k") do (
- if "%%y"=="" (
- echo %%x - %%i %%j
- ) else (
- set city=%%y
- if not "!city:~2!"=="" (
- for /f "delims=州" %%a in ("!city!") do set city=%%a
- )
- set city=!city:地区=!
- if "!city:~1!"=="" (
- echo %%x - %%i %%j
- ) else (
- echo %%x !city! %%i %%j
- )
- )
- )
- ))>.\result\省IP整理结果.txt
-
- :: 整理自治区IP数据
- :: “自治区-市(州/盟/地区)”、“自治区-市(州/盟/地区)-县(旗/市)”格式的取到市/州/盟/地区;
- :: “自治区-县(旗/市)”格式的取到县/旗/市;
- :: 若按前面的规则取到的最后一级地名为单字的,考虑到单名难以确定地名,将直接取省名
- :: 需要处理类似“云南省楚雄州楚雄市”这样的地名
- (for /f %%i in (.\config\自治区.txt) do (
- for /f "tokens=1-3" %%x in ('findstr /i "%%i" .\tmp\自治区IP.txt') do (
- set city=%%z
- set city=!city:%%i=!
- if "!city!"=="" (
- echo %%i - %%x %%y
- ) else (
- for /f "delims=市盟县旗 tokens=1,2" %%a in ("!city!") do (
- set city=%%a
- if not "!city:~2!"=="" (
- for /f "delims=州" %%m in ("!city!") do set city=%%m
- )
- set city=!city:地区=!
- if "!city:~1!"=="" (
- echo %%i - %%x %%y
- ) else (
- echo %%i !city! %%x %%y
- )
- )
- )
- )
- ))>.\result\自治区IP整理结果.txt
-
- :: 整理直辖市IP数据
- (for /f %%i in (.\config\直辖市.txt) do (
- set city=%%i
- set city=!city:~0,-1!
- for /f "tokens=1,2" %%x in ('findstr /i "%%i" .\tmp\直辖市IP.txt') do (
- echo !city! !city! %%x %%y
- )
- ))>.\result\直辖市IP整理结果.txt
-
- :: 整理香港和澳门IP数据
- (for %%i in (香港 澳门) do (
- for /f "tokens=1,2" %%x in (.\tmp\特别行政区IP.txt) do (
- echo %%i %%i %%x %%y
- )
- ))>.\result\特别行政区IP整理结果.txt
-
- :: 整理那些仅指明为"中国"的IP数据
- (for /f "tokens=1-2" %%i in ('findstr /i " 中国 " ip.txt') do (
- echo 中国 中国 %%i %%j
- ))>.\result\中国IP整理结果.txt
- pause
复制代码
需要把附件解压后的config目录放到当前目录下使用,纯真IP数据库释放后请重命名为ip.txt,必须放在当前目录下,最终处理结果放在result目录下。
存在的问题:在“自治区IP整理结果.txt”中,“内蒙古农业大学”和“新疆大学软件学院机房A区”之类的字段将直接显示去掉自治区名后的字符串,这是因为该字段中没有包含行政区划的关键字用于切分行政区划,虽然可以通过代码予以准确处理,但考虑到效率,还是手工替换为佳。
由于只做了初步核对,其他问题暂未发现。
不知道大家还有没有其他处理方案。
链接: https://pan.baidu.com/s/16OQbRLrS2JIVofVqF9PxTQ?pwd=668r
作者: caruko 时间: 2010-5-9 14:52
1, 中国省份并不多,并且省份名固定是2-3个字,个人觉得,可以设置为变量,如 set "广西=1"
2, 再先后查找%str:~0,2% ,%str:~0,3%的变量名,成功得到省份,并且接下来执行以下替换,从字符多到字符少如:
!str:广西= ! ,!str:广西省= !,!str:广西自治区= !,!str:广西市= ! 等通用称呼方式。
3, 也可以把某个省有很独特的别称,用写入变量的方式,如set "广西=广西省 广西自治区 广西壮族自治区 ",然后for循环..
4, 接下来set "sq=市 县 区 州 镇 盟",然后FOR循环, 检查%str:~-1%,相等则将"市 县 区 州 镇 盟"的字符替换为空格,取最后一个字符串,得到最精确地名。如:浙江省台州市温岭市,得到的是"浙江 温岭市"。
5, 如果最后一个字符不是%sq%的字符,但包含以上字符,则替换为空格后,取倒数第2个。如:北京朝阳区XX网吧;得到“北京 朝阳区”
6,如果最后一个字符不匹配,也不包含关键字,那么就是特殊地名; 如:内蒙古农业大学;得到“内蒙古 农业大学”;新疆大学软件学院机房A区则要特殊处理了..
最后,"中国"需要特殊处理, "北京市",这样的地名,取得省份后只剩下空格,可以直接输出了
作者: caruko 时间: 2010-5-9 15:09
想了一下,上述4,5步
可以简化为:
将"市 县 区 州 镇 盟" 替换为"市 县 区 州 镇 盟"外加一个空格或者其它字符,如"北京朝阳区" 变成了“北京朝阳区¥;“浙江省台州市温岭市”变成“浙江省台州市¥温岭市¥”,而"北京朝阳区XX网吧"或变成"北京朝阳区¥XX网吧",看最后一个字符是否¥来确定取那个位置。
作者: netbenton 时间: 2010-5-10 23:22
我下载不到数据库,第一个链接下到的文件错误
作者: sgaizxt001 时间: 2010-5-10 23:56
问题同楼上
qqwry.rar。只有2.91M
作者: gfwlxx 时间: 2010-7-31 13:47
这个问题我解决定了 ,先占位
作者: loquat 时间: 2010-8-18 22:45
如果这个问题能解决,获取移动基站数据应该也不难哈。。。
移动基站,小型GPS,嘿嘿。。。
作者: key123lxf 时间: 2010-8-27 21:50
够邪恶哇////
一帮牛人
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |