当前位置: 首页 > news >正文

数据分析中 使用ip2region来进行 ip地址转换为城市

 官网地址:https://github.com/lionsoul2014/ip2region/blob/master/ReadMe.md

介绍:具体看github上的readme文档

image

使用说明:

在github上下载ip2region_v4.xdb,并放在项目的src/main/resources下。下载地址:ip2region/data/ip2region_v4.xdb at master · lionsoul2014/ip2region

引入依赖:

 <dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.6.5</version></dependency>

测试数据:text.txt

106.39.41.166,10/Nov/2016:00:01:02 +0800,10,54 ,video,8701
113.140.11.123,10/Nov/2016:00:01:02 +0800,10,54 ,video,5915
125.122.216.102,10/Nov/2016:00:01:02 +0800,10,54 ,video,9819
116.231.219.242,10/Nov/2016:00:01:02 +0800,10,54 ,video,6335
61.136.143.62,10/Nov/2016:00:01:02 +0800,10,54 ,video,7629
39.186.247.142,10/Nov/2016:00:01:02 +0800,10,2957 ,video,3237

具体代码:

IpRegionProcessor
import org.lionsoul.ip2region.xdb.Searcher;import java.io.*;
import java.util.ArrayList;
import java.util.List;public class IpRegionProcessor {public static void main(String[] args) {// 数据库文件路径String dbPath = "src/main/resources/ip2region_v4.xdb";// 输入文件路径String inputFilePath = "d:\\IdeaProjects\\da12.15\\test.txt";// 输出文件路径String outputFilePath = "d:\\IdeaProjects\\da12.15\\output.txt";Searcher searcher = null;try {// 1. 加载整个xdb文件到内存byte[] cBuff = Searcher.loadContentFromFile(dbPath);// 2. 创建基于内存的查询对象searcher = Searcher.newWithBuffer(cBuff);// 3. 读取输入文件内容List<String> lines = readFile(inputFilePath);// 4. 处理每一行List<String> processedLines = processLines(lines, searcher);// 5. 写入输出文件writeFile(outputFilePath, processedLines);System.out.println("文件处理完成,结果已保存到: " + outputFilePath);} catch (Exception e) {System.err.println("处理文件时发生错误: " + e.getMessage());e.printStackTrace();} finally {// 6. 关闭资源if (searcher != null) {try {searcher.close();} catch (IOException e) {System.err.println("关闭Searcher时发生错误: " + e.getMessage());e.printStackTrace();}}}}/*** 读取文件内容*/private static List<String> readFile(String filePath) throws IOException {List<String> lines = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {String line;while ((line = reader.readLine()) != null) {lines.add(line);}}return lines;}/*** 写入文件内容*/private static void writeFile(String filePath, List<String> lines) throws IOException {try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {for (String line : lines) {writer.write(line);writer.newLine();}}}/*** 处理每一行,将IP地址转换为城市(ip)格式*/private static List<String> processLines(List<String> lines, Searcher searcher) throws Exception {List<String> processedLines = new ArrayList<>();for (String line : lines) {if (line.isEmpty()) {processedLines.add(line);continue;}// 提取第一个逗号前的IP地址int commaIndex = line.indexOf(',');if (commaIndex == -1) {processedLines.add(line);continue;}String ip = line.substring(0, commaIndex).trim();String restOfLine = line.substring(commaIndex);// 查询IP对应的区域信息String region = searcher.search(ip);String city = extractCity(region);// 构建新的行:城市(ip) + 剩余内容String newLine = city + "(" + ip + ")" + restOfLine;processedLines.add(newLine);}return processedLines;}/*** 从region信息中提取城市名* region格式:国家|省份|城市|ISP*/private static String extractCity(String region) {if (region == null || region.isEmpty()) {return "未知城市";}String[] parts = region.split("\\|");if (parts.length >= 3) {// 第三部分是城市return parts[2];} else if (parts.length == 2) {// 如果没有城市信息,返回省份return parts[1];} else {// 否则返回国家return parts[0];}}
}

运行结果:output.txt

北京市(106.39.41.166),10/Nov/2016:00:01:02 +0800,10,54 ,video,8701
西安市(113.140.11.123),10/Nov/2016:00:01:02 +0800,10,54 ,video,5915
杭州市(125.122.216.102),10/Nov/2016:00:01:02 +0800,10,54 ,video,9819
上海市(116.231.219.242),10/Nov/2016:00:01:02 +0800,10,54 ,video,6335
宜昌市(61.136.143.62),10/Nov/2016:00:01:02 +0800,10,54 ,video,7629
杭州市(39.186.247.142),10/Nov/2016:00:01:02 +0800,10,2957 ,video,3237

 

http://www.jsqmd.com/news/94566/

相关文章:

  • 生存分析核心代码曝光,R语言绘制临床数据曲线仅需5行命令
  • 【金融风险管理实战】:手把手教你用R语言计算VaR的5种核心方法
  • 【稀缺资源公开】:国家级量子仿真平台内部使用手册流出(限时解读)
  • 基于VDLL的矢量型GPS信号跟踪算法MATLAB仿真,包括程序+word设计文档
  • 《Flutter 工程化实践:从项目结构到 CI/CD 全链路落地》
  • 【Flutter x 鸿蒙】第五篇:导航、路由与多设备适配 - 青青子衿-
  • 两种方法实现循环温度的边界条件设置及复杂的温度变化
  • 【渲染的纹理:从入门到精通】:掌握GPU纹理映射核心技术的7大关键步骤
  • 【R语言时空可视化实战】:掌握环境监测数据动态展示的5大核心技巧
  • 【PHP扩展性能优化秘籍】:基于Rust的函数调试与内存泄漏排查指南
  • AI产品经理必看!企业AI落地的5大挑战与解决方案(建议收藏)
  • 【GraphQL性能优化指南】:利用PHP字段别名提升接口响应速度300%
  • 【Flutter x 鸿蒙】第六篇:状态管理、数据持久化与分布式数据 - 青青子衿-
  • React Native鸿蒙开发实战(四):路由导航与多页面应用 - 青青子衿-
  • 【DOTS物理系统深度解析】:掌握高性能物理模拟的5大核心技巧
  • 错过将后悔!R量子模拟中不可不知的门序列设计原则
  • 【资深架构师亲授】:构建零容错API——Symfony 8路由参数验证全流程控制
  • 刷题日记day6(数学)
  • 吴恩达深度学习课程四:计算机视觉 第二周:经典网络结构 (一)经典卷积网络
  • 【Flutter x 鸿蒙】第四篇:双向通信——Flutter调用鸿蒙原生能力 - 青青子衿-
  • 【医疗数据监管新规应对指南】:基于PHP的实时审计日志监控系统搭建
  • 锂离子电池二阶等效电路模型,基于MATLAB SIMULINK模块搭建,模型中包含一套完整的二...
  • Java毕设项目:基于springboot工资管理系统(源码+文档,讲解、调试运行,定制等)
  • LangChain 1.0 Agent开发实战:从入门到智能运行体构建!
  • 美国银行可以“炒币”了?加密货币公司“持证”开启金融新玩法!
  • 【R Shiny多模态数据导入终极指南】:掌握5种高效组件实现无缝数据集成
  • concaveman
  • 2025最新模温机供应商厂家推荐排行榜
  • 基于STM32智能营养称系统的设计与实现_352
  • Java毕设项目:基于SpringBoot+Vue高校奖学金评定管理系统设计与实现基于springboot高校学生奖学金评定系统的设计与实现(源码+文档,讲解、调试运行,定制等)