C# 智能识别地址简易代码
由于项目需要 简易写了一个智能识别地址的后端程序
model定义
public class AddressModel
{
// 省
public string province { get; set; }
// 市
public string city { get; set; }
// 区县
public string area { get; set; }
// 位置
public string address { get; set; }
//名字
public string name { get; set; }
// 邮编
public string zip_code { get; set; }
public string mobile { get; set; }
}
public class AreaListModel
{
public List<AreaList> areaList { get; set; }
}
public class AreaList
{
public string name { get; set; }
public List<City> city { get; set; }
public string json { get; set; }
}
public class City
{
public string name { get; set; }
public List<string> area { get; set; }
}
public class ZipCodeModel
{
// 省级id
public int id { get; set; }
// 省名
public string name { get; set; }
// 市
public List<Child> child { get; set; }
}
public class Child
{
// 市id
public int id { get; set; }
// 市名
public string name { get; set; }
// 区县
public List<child> child { get; set; }
}
public class child
{
// 区县id
public int id { get; set; }
// 区县名
public string name { get; set; }
// 区县代码
public string zipcode { get; set; }
}
方法
public class AddressParse
{
// 解析邮编
public List<string> PostCodeParse()
{
string jsonFile = "D://PostCode.json";
StreamReader file = System.IO.File.OpenText(jsonFile);
JsonTextReader reader = new JsonTextReader(file);
JArray o = (JArray)JToken.ReadFrom(reader);
List<ZipCodeModel> zipCodeModels = JsonConvert.DeserializeObject<List<ZipCodeModel>>(o.ToString());
List<string> codeList = new List<string>();
for (int i = 0; i < zipCodeModels.Count; ++i)
{
if (zipCodeModels[i].child != null)
{
for (int j = 0; j < zipCodeModels[i].child.Count; ++j)
{
for (int k = 0; k < zipCodeModels[i].child[j].child.Count; ++k)
{
codeList.Add(zipCodeModels[i].child[j].child[k].zipcode);
}
}
}
}
return codeList;
}
//
public AddressModel AddressRecognize(string address)
{
try
{
AddressModel parse = new AddressModel();
AreaListModel areaListModel = new AreaListModel();
string jsonFile = "D://AreaList.json";
StreamReader file = System.IO.File.OpenText(jsonFile);
JsonTextReader reader = new JsonTextReader(file);
JArray o = (JArray)JToken.ReadFrom(reader);
List<AreaList> items = JsonConvert.DeserializeObject<List<AreaList>>(o.ToString());
areaListModel.areaList = items;
string[] provinceKey = { "特别行政区", "古自治区", "维吾尔自治区", "壮族自治区", "回族自治区", "自治区", "省省直辖", "省", "市" };
string[] cityKey = { "布依族苗族自治州", "苗族侗族自治州", "自治州", "州", "市", "县" };
// string[] Province = new string[] { };
int n = areaListModel.areaList.Count;
string[] Province = new string[n];
for (int i = 0; i < areaListModel.areaList.Count; i++)
{
Province[i] = areaListModel.areaList[i].name;
}
for (int i = 0; i < areaListModel.areaList.Count; i++)
{
int index = 0;
// foreach (string item in Province)
for (int a = 0; a < Province.Length; a++)
{
index = address.IndexOf(Province[a]);
if (index > -1)
{
if (index > 0)
{
//省份不是在第一位的,在省份之前的字段识别为人名
parse.name = address.Substring(0, index).Trim();
}
// parse.province = Province[index];
parse.province = Province[a];
address = address.Substring(index + parse.province.Length);
foreach (string obj in provinceKey)
{
if (address.IndexOf(obj) == 0)
{
address = address.Substring(obj.Length);
}
}
int m = areaListModel.areaList[a].city.Count;
string[] cityArray = new string[m];
for (int j = 0; j < areaListModel.areaList[a].city.Count; ++j)
{
cityArray[j] = areaListModel.areaList[a].city[j].name;
}
for (int j = 0; j < areaListModel.areaList[a].city.Count; ++j)
{
int flag = 0;
flag = address.IndexOf(areaListModel.areaList[a].city[j].name);
if (flag > -1 && flag < 3)
{
parse.city = areaListModel.areaList[a].city[j].name;
address = address.Substring(flag + parse.city.Length);
for (int k = 0; k < cityKey.Length; ++k)
{
if (address.IndexOf(cityKey[k]) == 0)
{
address = address.Substring(cityKey[k].Length);
}
}
int t = areaListModel.areaList[a].city[j].area.Count;
string[] areaArray = new string[t];
if (areaListModel.areaList[a].city[j].area != null)
{
for (int c = 0; c < areaListModel.areaList[a].city[j].area.Count; c++)
{
areaArray[c] = areaListModel.areaList[a].city[j].area[c];
}
int areaFlag = 0;
// foreach (string areaItem in areaArray)
for (int d = 0; d < areaArray.Length; d++)
{
areaFlag = address.IndexOf(areaListModel.areaList[a].city[j].area[d]);
if (areaFlag > -1 && areaFlag < 3)
{
parse.area = areaListModel.areaList[a].city[j].area[d];
address = address.Substring(areaFlag + parse.area.Length);
break;
}
}
}
break;
}
}
parse.address = address.Trim();
break;
}
}
}
// 调用PostCodeParse()获取邮编集合
List<string> codeList = PostCodeParse();
// for (int i = 0; i < codeList.Count; i++)
int codeFlag = 0;
foreach (string item in codeList)
{
while (address.Contains(item)) {
parse.zip_code = item;
parse.address = address.Replace(item, "");
break;
}
}
string result = "";
foreach (Match match in Regex.Matches(parse.address, @"\d+")) {
result = match.Value.Length > result.Length ? match.Value : result;
}
if (result != null) {
parse.mobile = result;
parse.address = parse.address.Replace(parse.mobile,"");
}
return parse;
}
catch (Exception e)
{
throw e;
}
}
直接调用AddressParse.AddressRecognize(“具体地址(人名省市县具体位置 邮编 手机等)”)