/*--------------------------------------------------------------
__version__ = '1.0.0'
__license__ = "GNU General Public License (GPL) Version 3"
__version_info__ = (1, 0, 0)
__author__ = 'yuqiaoling yangyuyu9898@163.com'
__function__ = 'The national standard of administrative division code into a json file.'
__data__ = '2014.11.1'
--------------------------------------------------------------*/
#include <Windows.h>
#include <string>
#include <iostream>
#include <fstream>
#include <iosfwd>
#include <map>
using namespace std;
string GetStrNumber(int nNumber)
{
char szNumber[4];
if (nNumber < 10)
{
sprintf(szNumber, "0%d", nNumber);
}else
{
sprintf(szNumber, "%d", nNumber);
}
string strNumn = szNumber;
return strNumn;
}
void main()
{
//读文件即读取行政区划文件
ifstream ifile;
char szLine[MAX_PATH] ;
char szID[10+1] ={0};
char szName[100+1] ={0};
string strPath = "GBzonecode.ini";
ifile.open(strPath);
map <int, string, less<int>> mapGbsZone;
while(ifile)
{
ifile.getline(szLine,MAX_PATH);
sscanf(szLine, "%s %s",szID, szName);
int nTollNum = atoi(szID);
mapGbsZone.insert(pair<int, string>(nTollNum,szName));
}
ifile.close();
//写json数据文件
int nFirtNum = 0;
int nSendNum = 0;
int nThirdNum = 0;
char filename[] = "gbzonecode.js";
ofstream foutFile(filename);
//@yu 创建一个省份为空数据项(初始化行政区划时可以设置为空,并且代码是“000000”)
foutFile <<"var GBS_ZONE_CODE = {\n";
foutFile << " \"emptyProvince\" ; {\n";
foutFile << " \"emptyProvince\" ; \"00\"\n";
foutFile <<" \"emptyCity\" : {\n";
foutFile <<" \"emptyCity\" : \"00\",\n";
foutFile <<" \"emptyCounty\" : {\n";
foutFile <<" \"emptyCounty\" : \"00\"\n";
foutFile <<" }\n";
foutFile <<" }\n";
foutFile <<" },\n";
map<int,string>::iterator itrGbszone = mapGbsZone.begin();
for ( ;itrGbszone != mapGbsZone.end();++itrGbszone)
{
int nTollNum = itrGbszone->first;
string strName = itrGbszone->second;
int nProvince = nTollNum /10000;
int nProvinceRemainder = nTollNum % 10000;
int nCity = nProvinceRemainder / 100;
int nCounty = nProvinceRemainder % 100;
if (nProvinceRemainder == 0)
{
//下面是处理省级的逻辑(例如:浙江省,代号是330000)
if (nFirtNum == nProvince)
{
//主要是用于一开始nFirtNum为初始化时加入一个大括号
if (!nFirtNum)
{
foutFile <<" },\n";
}
}else
{
//从上一级省份到另一省份时加入大括号
if (nFirtNum)
{
foutFile <<" }\n";
foutFile <<" }\n";
foutFile <<" },\n";
}
//写入省份的数据,外加一个市级为空的数据项。(代号例如:上海市【310000】等这种)
string strNum = GetStrNumber(nProvince);
foutFile <<" \""<<strName<< "\" : {\n";
foutFile <<" \""<<strName<<"\" : \""<<strNum<<"\",\n";
foutFile <<" \"emptyCity\" : {\n";
foutFile <<" \"emptyCity\" : \"00\",\n";
foutFile <<" \"emptyCounty\" : {\n";
foutFile <<" \"emptyCounty\" : \"00\"\n";
}
//将一些标记数据也更新一边
nFirtNum = nProvince;
nSendNum = 0;
nThirdNum = 0;
}else if (nProvinceRemainder != 0 && nCounty == 0)
{
//下面是处理市级的逻辑(例如:浙江省杭州市,代号是330100)
string strNum = GetStrNumber(nCity);
if (nSendNum != nCity)
{
//从一个市到另一个市之间,加入大括号
foutFile <<" }\n";
foutFile <<" },\n";
}
//写入市级的数据,外加一个区或者县级为空的数据项。(代号例如:浙江省杭州市【330100】等这种)
foutFile <<" \""<<strName<<"\" : {\n";
foutFile <<" \""<<strName<<"\" : \""<<strNum<<"\",\n";
foutFile <<" \"emptyCounty\" : {\n";
foutFile <<" \"emptyCounty\" : \"00\"\n";
//将一些标记数据也更新一边
nSendNum = nCity;
nThirdNum = 0;
}else if(nProvinceRemainder != 0 && nCounty != 0)
{
//下面是处理区或者县级的逻辑(例如:浙江省杭州市余杭区,代号是330110)
if (nThirdNum != nCounty)
{
//从一个区或者县到另一个区或者县之间,加入大括号
foutFile <<" },\n";
}
//写入区或者县级的数据,外加一个区或者县级为空的数据项。(代号例如:浙江省杭州市【330100】等这种)
string strNum = GetStrNumber(nCounty);
foutFile <<" \""<<strName<<"\" : {\n";
foutFile <<" \""<<strName<<"\" : \""<<strNum<<"\"\n";
//将一些标记数据也更新一边
nThirdNum = nCounty;
}
}
//最后将补上大括号,完成整个数据写入
foutFile <<" }\n";
foutFile <<" }\n";
foutFile <<" }\n";
foutFile <<"}\n";
foutFile.close();
}