下面是Java如何从地址串中解析提取省市区的攻略:
一、准备工作
-
导入相关工具包。这里我们会用到
commons-csv
和commons-lang3
这两个工具包。可以用Maven或Gradle自动化地导入。 -
下载地址库。可以从国家统计局官网下载最新的地址数据库,也可以从GitHub上下载已经格式化好的CSV格式地址库。
-
将地址库导入内存中的
Hash表
中,便于地址的快速查找和匹配。
二、详细步骤
下面详细介绍从地址串中提取省市区的Java代码实现过程:
- 引入相关工具包:
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.lang3.StringUtils;
- 定义一个
Hash表
,将地址库导入内存:
// 声明Map对象,key为地址编码,value为地址名称
private Map<String, String> addressMap = new HashMap<>();
// 将地址编码和名称的映射关系导入内存中的Map中
public void loadAddress() throws Exception {
// 读取CSV格式的地址库数据
Reader reader = new InputStreamReader(this.getClass().getResourceAsStream("/china_address.csv"), "UTF-8");
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());
for (CSVRecord csvRecord : csvParser) {
String code = csvRecord.get("编码");
String name = csvRecord.get("名称");
addressMap.put(code, name);
}
}
- 实现解析地址的方法:
/**
* 解析地址
* @param address 地址串
* @return 包含省市区的Map
*/
public Map<String, String> parseAddress(String address) throws Exception {
Map<String, String> resultMap = new HashMap<>();
// 对地址串进行处理,删除空格
address = address.replaceAll("\\s*", "");
// 进行省市区匹配
for (int i = 6; i >= 2; i--) {
String provinceCode = address.substring(0, i) + "0000";
String provinceName = addressMap.get(provinceCode);
if (provinceName == null) {
continue;
}
int j = i + 2;
String cityCode = address.substring(0, j) + "00";
String cityName = null;
if (StringUtils.equals(provinceName, "北京市") || StringUtils.equals(provinceName, "天津市") || StringUtils.equals(provinceName, "上海市") || StringUtils.equals(provinceName, "重庆市")) {
cityName = provinceName;
} else {
cityName = addressMap.get(cityCode);
if (cityName == null) {
continue;
}
}
String districtName = null;
if (address.length() > j) {
districtName = address.substring(j);
if (StringUtils.equals(districtName, "县")) {
String countyCode = cityCode.substring(0, 4) + "10";
String countyName = addressMap.get(countyCode);
if (StringUtils.isNotBlank(countyName)) {
districtName = countyName;
}
}
}
resultMap.put("province", provinceName);
resultMap.put("city", cityName);
resultMap.put("district", districtName);
return resultMap;
}
// 没有匹配上,则返回空Map
return resultMap;
}
在上面的代码中,我们首先将地址串中的空格删除,然后按照“省-市-区”的顺序进行匹配。注意,省、市的编码是可以直接从地址串中提取出来的,而区的名称需要通过匹配地址库来获得。如果匹配失败,则跳过该级,直到找到最高级的为止。
三、两条示例
下面给出两条示例:
- 示例地址:广东省深圳市南山区西丽街道科技中一路12号
Map<String, String> resultMap = parseAddress("广东省深圳市南山区西丽街道科技中一路12号");
System.out.println(resultMap);// 输出:{province=广东省, city=深圳市, district=南山区}
- 示例地址:湖南省岳阳市临湘市大塘乡陈家村
Map<String, String> resultMap = parseAddress("湖南省岳阳市临湘市大塘乡陈家村");
System.out.println(resultMap);// 输出:{province=湖南省, city=岳阳市, district=临湘市}
以上就是提取地址中的省市区的攻略和示例。希望可以对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java如何从地址串中解析提取省市区(完美匹配中国所有地址) - Python技术站