Board logo

标题: 批处理从纯真IP数据库内提取国内IP数据 [打印本页]

作者: namejm    时间: 2010-5-8 12:58     标题: 批处理从纯真IP数据库内提取国内IP数据

  在CN-DOS看到了一个很好的应用话题,与头两天本论坛内整理手机号码数据库的话题有点类似,特转过来大家讨论一下。

  以下是CN-DOS转过来的原文,略有改动和删节(原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=51160):
  从纯真IP数据库中提取国内IP数据。

处理规则:
1、把不包含中国省市地名的记录删掉。
2、把省份名称拆出来放在一个字段里,把城市名称放到另一个字段里。
3、处理后的信息要包含有:省、市、ip开始地址、ip结束地址
4、直辖市的省份名称和城市名称一样。
5、例如处理成这样的格式:
省 市 ip开始地址 ip结束地址
湖南 张家界 211.0.0.1 211.255.255.255
北京 北京 211.100.26.179 211.100.26.190

6、如果有记录只精确到省份,城市则以"-"代替,输出成这样:
广西 - 222.217.171.167 222.217.171.255

7、最终输出的文件格式可以是MDB,EXCEL,CSV,MSSQL或者其它。



下载区:

纯真IP数据库---自带的SHOWIP.EXE可以把IP数据解压为txt格式文本
=== http://update.cz88.net/soft/qqwry.rar


hrsIP---纯真IP数据转ACCESS MDB数据库
=== http://img3.k68-img.cn/k68over20 ... n_2010571240_01.zip

文本编辑器win32pad ---可以打开20M的文本不假死,这个工具本身才33K,绿色解压即用
=== http://www.gena01.com/win32pad/win32pad_1_5_10_4.zip

FR.EXE ---正则查找替换命令行工具===
http://baiy.cn/utils/fr/fr.rar

从SQL SERVER 2000中提取的OSQL.EXE和ISQL.EXE---方便在批处理中连接SQLSERVER并执行SQL命令
=== http://img2.k68.cn/k68over2008-1 ... 200921311843_01.rar

OleDbCmd---在批处理中连接MDB数据和执行SQL命令
===下载页面: http://sourceforge.net/projects/oledbcmd/

作者: 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

根据楼上的分析,得到如下代码:
  1. @echo off
  2. md tmp 2>nul
  3. setlocal enabledelayedexpansion
  4. for /f %%i in ('dir /a-d /b .\config\*.txt') do (
  5.     findstr /ig:".\config\%%i" ip.txt>.\tmp\%%~niIP.txt
  6. )
  7. md result 2>nul
  8. :: 整理省份IP数据
  9. :: “省-市(州/地区)”、“省-市(州/地区)-县”格式的取到市/州/地区;
  10. :: “省-县(市)”格式的取到县/市;
  11. :: 若按前面的规则取到的最后一级地名为单字的,考虑到单名难以确定地名,将直接取省名
  12. :: 需要处理类似“云南省楚雄州楚雄市”这样的地名
  13. (for /f "tokens=1-3" %%i in (.\tmp\省IP.txt) do (
  14.     for /f "delims=省市县 tokens=1,2" %%x in ("%%k") do (
  15.         if "%%y"=="" (
  16.             echo %%x - %%i %%j
  17.         ) else (
  18.             set city=%%y
  19.             if not "!city:~2!"=="" (
  20.                 for /f "delims=州" %%a in ("!city!") do set city=%%a
  21.             )
  22.             set city=!city:地区=!
  23.             if "!city:~1!"=="" (
  24.                 echo %%x - %%i %%j
  25.             ) else (
  26.                 echo %%x !city! %%i %%j
  27.             )
  28.         )
  29.     )
  30. ))>.\result\省IP整理结果.txt
  31. :: 整理自治区IP数据
  32. :: “自治区-市(州/盟/地区)”、“自治区-市(州/盟/地区)-县(旗/市)”格式的取到市/州/盟/地区;
  33. :: “自治区-县(旗/市)”格式的取到县/旗/市;
  34. :: 若按前面的规则取到的最后一级地名为单字的,考虑到单名难以确定地名,将直接取省名
  35. :: 需要处理类似“云南省楚雄州楚雄市”这样的地名
  36. (for /f %%i in (.\config\自治区.txt) do (
  37.     for /f "tokens=1-3" %%x in ('findstr /i "%%i" .\tmp\自治区IP.txt') do (
  38.         set city=%%z
  39.         set city=!city:%%i=!
  40.         if "!city!"=="" (
  41.             echo %%i - %%x %%y
  42.         ) else (
  43.             for /f "delims=市盟县旗 tokens=1,2" %%a in ("!city!") do (
  44.                 set city=%%a
  45.                 if not "!city:~2!"=="" (
  46.                     for /f "delims=州" %%m in ("!city!") do set city=%%m
  47.                 )
  48.                 set city=!city:地区=!
  49.                 if "!city:~1!"=="" (
  50.                     echo %%i - %%x %%y
  51.                 ) else (
  52.                     echo %%i !city! %%x %%y
  53.                 )
  54.             )
  55.         )
  56.     )
  57. ))>.\result\自治区IP整理结果.txt
  58. :: 整理直辖市IP数据
  59. (for /f %%i in (.\config\直辖市.txt) do (
  60.     set city=%%i
  61.     set city=!city:~0,-1!
  62.     for /f "tokens=1,2" %%x in ('findstr /i "%%i" .\tmp\直辖市IP.txt') do (
  63.         echo !city! !city! %%x %%y
  64.     )
  65. ))>.\result\直辖市IP整理结果.txt
  66. :: 整理香港和澳门IP数据
  67. (for %%i in (香港 澳门) do (
  68.     for /f "tokens=1,2" %%x in (.\tmp\特别行政区IP.txt) do (
  69.         echo %%i %%i %%x %%y
  70.     )
  71. ))>.\result\特别行政区IP整理结果.txt
  72. :: 整理那些仅指明为"中国"的IP数据
  73. (for /f "tokens=1-2" %%i in ('findstr /i " 中国 " ip.txt') do (
  74.     echo 中国 中国 %%i %%j
  75. ))>.\result\中国IP整理结果.txt
  76. 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