numberexport.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. #include "numberexport.h"
  2. #include "SNCDataBase.h"
  3. NumberExport::NumberExport(NumberListModel *model,QString fileNamePrefix,enum NumberExportType exportType)
  4. {
  5. this->model = model;
  6. this->fileNamePrefix = fileNamePrefix;
  7. this->stop = false;
  8. this->exportType = exportType;
  9. this->batchSize = 100000;
  10. this->isCity = true;
  11. }
  12. NumberExport::~NumberExport()
  13. {
  14. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  15. <<"NumberExport Destroyed.";
  16. }
  17. void NumberExport::abort()
  18. {
  19. this->stop = true;
  20. }
  21. void NumberExport::setBatchSize(int batchSize)
  22. {
  23. this->batchSize = batchSize;
  24. }
  25. void NumberExport::setCityOrProvince(bool isCity)
  26. {
  27. this->isCity = isCity;
  28. }
  29. void NumberExport::setGroupSate(bool isAll)
  30. {
  31. this->isAll = isAll;
  32. }
  33. void NumberExport::setSegment(int len)
  34. {
  35. this->len = len;
  36. }
  37. void NumberExport::run()
  38. {
  39. QTime t;
  40. t.start();
  41. switch(exportType)
  42. {
  43. case ExportByAll:
  44. exportByAll();
  45. break;
  46. case ExportByBatch:
  47. exportByBatch();
  48. break;
  49. case ExportByCorp:
  50. exportByCorp();
  51. break;
  52. case ExportByRegion:
  53. exportByRegion();
  54. break;
  55. case ExportByDuplicate:
  56. exportByDuplicate();
  57. break;
  58. case ExportBySegment:
  59. exportBySegmentByLen(this->len);
  60. break;
  61. default:
  62. break;
  63. }
  64. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  65. <<"Number Export Elapsed Time"<<t.elapsed();
  66. }
  67. void NumberExport::exportByAll() //export by all
  68. {
  69. QFile file(fileNamePrefix+"_"+QString::number(model->getCount())+".txt");
  70. if(!file.open(QIODevice::WriteOnly))
  71. return ;
  72. QTextStream out(&file);
  73. int progress = 0;
  74. int groups = SNCCore::getBatchGroups(model->getCount(),batchSize);
  75. emit progressMaxUpdated(groups);
  76. //fix on 2012-8-27
  77. // int count = 0;
  78. // for(int i=0;i<model->getSegments().size();i++)
  79. // {
  80. // for(int j=0;j<model->getNumbers().at(i).size();j++)
  81. // {
  82. // count++;
  83. // QString num = model->getSegments().at(i) + model->getNumbers().at(i).at(j);
  84. // out << num + "\r\n";
  85. // //qDebug()<<count<<num;
  86. // if(count % batchSize == 0 || count == model->getCount())
  87. // {
  88. // progress++;
  89. // emit progressUpdated(progress);
  90. // }
  91. // }
  92. // }
  93. // emit progressUpdated(groups);
  94. model->setMapIndex();
  95. for(int i=0;i<model->getCount();i++)
  96. {
  97. if(i<model->getCount()-1)
  98. out<<model->getNumberEx(i)<<"\r\n";
  99. else
  100. out<<model->getNumberEx(i);
  101. if(((i+1)%batchSize==0 && (i+1)/batchSize>0)|| i==model->getCount()-1)
  102. {
  103. progress++;
  104. emit progressUpdated(progress);
  105. }
  106. }
  107. file.close();
  108. emit exportFinished();
  109. }
  110. void NumberExport::exportByBatch()//export by group
  111. {
  112. int size = model->getCount();
  113. emit progressMaxUpdated(size);
  114. int progress = qMax(size/50,1);
  115. // int count = 0;
  116. // int batch = 0;
  117. // int itemsToFetch = 0;
  118. // QString num ;
  119. // for(int i=0;i<model->getSegments().size();i++)
  120. // {
  121. // for(int j=0;j<model->getNumbers().at(i).size();j++)
  122. // {
  123. // count++;
  124. // itemsToFetch++;
  125. // num += model->getSegments().at(i) + model->getNumbers().at(i).at(j) + "\r\n";
  126. // if(count % batchSize == 0 || count == model->getCount())
  127. // {
  128. // QFile file(fileNamePrefix+"_第"+QString::number(++batch)+"批_"+QString::number(itemsToFetch)+".txt");
  129. // if(file.open(QIODevice::WriteOnly))
  130. // {
  131. // QTextStream out(&file);
  132. // out<<num;
  133. // num = "";
  134. // itemsToFetch = 0;
  135. // file.close();
  136. // }
  137. // }
  138. // if( count % progress ==0 || count == size)
  139. // {
  140. // emit progressUpdated(count);
  141. // }
  142. // }
  143. // }
  144. // emit progressUpdated(size);
  145. model->setMapIndex();
  146. int groups = SNCCore::getBatchGroups(size,this->batchSize);
  147. for(int i=0;i<groups;i++)
  148. {
  149. if(stop)
  150. break;
  151. int remainder = size - i*this->batchSize;
  152. int itemsToFetch = qMin(this->batchSize, remainder);
  153. QFile file(fileNamePrefix+"_第"+QString::number(i+1)+"批_"+QString::number(itemsToFetch)+".txt");
  154. if(!file.open(QIODevice::WriteOnly))
  155. return ;
  156. QTextStream out(&file);
  157. QString content ="";
  158. for(int j=i*this->batchSize;j<i*this->batchSize+itemsToFetch;j++)
  159. {
  160. if( (j+1) % progress ==0 || j==size-1)
  161. {
  162. emit progressUpdated(j+1);
  163. }
  164. //content+=model->getNumberEx(j)+"\r\n";
  165. //fix-1000多万的号码,分两批导出,每个包5650000个号码,导出到44%的时候报错
  166. //modify by xxw on 2016-5-23
  167. content =model->getNumberEx(j)+"\r\n";
  168. out << content;
  169. }
  170. //fix-1000多万的号码,分两批导出,每个包5650000个号码,导出到44%的时候报错
  171. //modify by xxw on 2016-5-23
  172. //out << content;
  173. file.close();
  174. if(!isAll)
  175. {
  176. emit progressUpdated(size);
  177. break;
  178. }
  179. }
  180. emit exportFinished();
  181. }
  182. //modify by xxw on 2016-3-17
  183. //增加虚拟运营商
  184. void NumberExport::exportByCorp()//export by corp
  185. {
  186. int size = this->model->getSegments().size();
  187. emit progressMaxUpdated(size);
  188. QFile fileCMCC(fileNamePrefix+"_移动.txt");
  189. QFile fileCTCC(fileNamePrefix+"_电信.txt");
  190. QFile fileCUTC(fileNamePrefix+"_联通.txt");
  191. QFile fileXNTC(fileNamePrefix+"_虚拟.txt");
  192. fileCMCC.open(QIODevice::WriteOnly);
  193. fileCTCC.open(QIODevice::WriteOnly);
  194. fileCUTC.open(QIODevice::WriteOnly);
  195. fileXNTC.open(QIODevice::WriteOnly);
  196. QTextStream outCMCC(&fileCMCC);
  197. QTextStream outCTCC(&fileCTCC);
  198. QTextStream outCUTC(&fileCUTC);
  199. QTextStream outXNTC(&fileXNTC);
  200. int l,m,n,p;
  201. l=0;
  202. m=0;
  203. n=0;
  204. p=0;
  205. for(int i=0;i<size;i++)
  206. {
  207. if(stop)
  208. break;
  209. QString segment = this->model->getSegments().at(i);
  210. if(NumberReg::getCMCCReg().exactMatch(segment+"0000"))
  211. {
  212. for(int j=0;j<this->model->getNumbers().at(i).size();j++)
  213. {
  214. outCMCC << segment+this->model->getNumbers().at(i).at(j)<<"\r\n";
  215. l++;
  216. }
  217. }
  218. if(NumberReg::getCTCCReg().exactMatch(segment+"0000"))
  219. {
  220. for(int j=0;j<this->model->getNumbers().at(i).size();j++)
  221. {
  222. outCTCC << segment+this->model->getNumbers().at(i).at(j)<<"\r\n";
  223. m++;
  224. }
  225. }
  226. if(NumberReg::getCUTCReg().exactMatch(segment+"0000"))
  227. {
  228. for(int j=0;j<this->model->getNumbers().at(i).size();j++)
  229. {
  230. outCUTC << segment+this->model->getNumbers().at(i).at(j)<<"\r\n";
  231. n++;
  232. }
  233. }
  234. if(NumberReg::getXNTCReg().exactMatch(segment+"0000"))
  235. {
  236. for(int j=0;j<this->model->getNumbers().at(i).size();j++)
  237. {
  238. outXNTC << segment+this->model->getNumbers().at(i).at(j)<<"\r\n";
  239. p++;
  240. }
  241. }
  242. emit progressUpdated(i+1);
  243. }
  244. fileCMCC.close();
  245. fileCTCC.close();
  246. fileCUTC.close();
  247. fileXNTC.close();
  248. if(l==0)
  249. QFile::remove(fileNamePrefix+"_移动.txt");
  250. if(m==0)
  251. QFile::remove(fileNamePrefix+"_电信.txt");
  252. if(n==0)
  253. QFile::remove(fileNamePrefix+"_联通.txt");
  254. if(p==0)
  255. QFile::remove(fileNamePrefix+"_虚拟.txt");
  256. if(l>0)
  257. QFile::rename(fileNamePrefix+"_移动.txt",fileNamePrefix+"_移动_"+QString::number(l)+".txt");
  258. if(m>0)
  259. QFile::rename(fileNamePrefix+"_电信.txt",fileNamePrefix+"_电信_"+QString::number(m)+".txt");
  260. if(n>0)
  261. QFile::rename(fileNamePrefix+"_联通.txt",fileNamePrefix+"_联通_"+QString::number(n)+".txt");
  262. if(p>0)
  263. QFile::rename(fileNamePrefix+"_虚拟.txt",fileNamePrefix+"_虚拟_"+QString::number(p)+".txt");
  264. emit exportFinished();
  265. //deleteLater();
  266. }
  267. void NumberExport::exportBySegmentByLen(int len)//export by segemnt len
  268. {
  269. NumberListModel *newModel = new NumberListModel();
  270. newModel->setNumberList(this->model->getSegments(),this->model->getNumbers());
  271. newModel->mergeSegment();
  272. int size = newModel->getSegments().size();
  273. emit progressMaxUpdated(size);
  274. int progress = qMax(size/50,1) ;
  275. int count = 0;
  276. QString seg;
  277. QString buffer;
  278. for(int i=0;i<size;i++)
  279. {
  280. QString segment = newModel->getSegments().at(i);
  281. for(int j=0;j<newModel->getNumbers().at(i).size();j++)
  282. {
  283. QString num = segment+newModel->getNumbers().at(i).at(j)+"\r\n";
  284. QString key = num.left(len);
  285. if(seg.isEmpty())
  286. {
  287. buffer = num;
  288. seg = key;
  289. count = 1;
  290. }
  291. else
  292. {
  293. if(key!=seg)
  294. {
  295. QFile file(fileNamePrefix+"_"+seg+"_"+ QString::number(count)+ ".txt");
  296. if(file.open(QIODevice::WriteOnly))
  297. {
  298. QTextStream out(&file);
  299. out << buffer;
  300. file.close();
  301. count = 0;
  302. }
  303. seg = key;
  304. count = 1;
  305. buffer = num;
  306. }
  307. else
  308. {
  309. buffer += num;
  310. count++;
  311. }
  312. }
  313. }
  314. if( i % progress == 0 || i == size-1)
  315. emit progressUpdated(i+1);
  316. }
  317. if(!buffer.isEmpty())
  318. {
  319. QFile file(fileNamePrefix+"_"+seg+"_"+ QString::number(count)+ ".txt");
  320. if(file.open(QIODevice::WriteOnly))
  321. {
  322. QTextStream out(&file);
  323. out << buffer;
  324. file.close();
  325. }
  326. }
  327. newModel->clear();
  328. delete newModel;
  329. emit exportFinished();
  330. }
  331. void NumberExport::exportByDuplicate()//export by times
  332. {
  333. QStringList segments;
  334. QList<QStringList> numbers;
  335. NumberListModel *newModel = new NumberListModel();
  336. newModel->setNumberList(this->model->getSegments(),this->model->getNumbers());
  337. newModel->mergeSegment();
  338. segments = newModel->getSegments();
  339. numbers = newModel->getNumbers();
  340. int size = segments.size();
  341. emit progressMaxUpdated(size);
  342. QMap<int,int> map;
  343. for(int i=0;i<segments.size();i++)
  344. {
  345. numbers[i].sort();
  346. QMultiMap<int,QString> multimap;
  347. int same = 1;
  348. QString number=numbers.at(i).at(0);
  349. QString data = segments.at(i) + number + "\r\n";
  350. for(int j=1;j<numbers.at(i).size();j++)
  351. {
  352. if(numbers.at(i).at(j) == number)
  353. {
  354. same++;
  355. }
  356. else
  357. {
  358. if(map.contains(same))
  359. map.insert(same,map.value(same)+1);
  360. else
  361. map.insert(same,1);
  362. multimap.insert(same,data);
  363. same = 1;
  364. number = numbers.at(i).at(j);
  365. data = segments.at(i) + number + "\r\n";
  366. }
  367. }
  368. if(map.contains(same))
  369. map.insert(same,map.value(same)+1);
  370. else
  371. map.insert(same,1);
  372. multimap.insert(same,data);
  373. foreach(int key,multimap.uniqueKeys())
  374. {
  375. QStringList list = multimap.values(key);
  376. QString f = fileNamePrefix+"_出现"+QString::number(key)+"次"+".txt";
  377. QFile file(f);
  378. file.open(QIODevice::Append);
  379. QTextStream out(&file);
  380. QString buffer;
  381. for( int i=0;i<list.size();i++)
  382. {
  383. buffer += list.at(i);
  384. }
  385. out<<buffer;
  386. file.close();
  387. }
  388. emit progressUpdated(i+1);
  389. }
  390. foreach(int key,map.keys())
  391. {
  392. int count = map.value(key);
  393. QString tmpName = fileNamePrefix+"_出现"+QString::number(key)+"次.txt";
  394. QString finalName = fileNamePrefix+"_出现"+QString::number(key)+"次_"+QString::number(count)+".txt";
  395. QFile::rename(tmpName,finalName);
  396. }
  397. newModel->clear();
  398. delete newModel;
  399. emit exportFinished();
  400. }
  401. //mod by wzx
  402. void NumberExport::exportByRegion() //export by city
  403. {
  404. QStringList segments;
  405. QList<QStringList> numbers;
  406. NumberListModel *tmpModel = new NumberListModel();
  407. tmpModel->setNumberList(this->model->getSegments(), this->model->getNumbers());
  408. tmpModel->mergeSegment();
  409. segments = tmpModel->getSegments();
  410. numbers = tmpModel->getNumbers();
  411. emit progressMaxUpdated(segments.size()+2);
  412. emit progressUpdated(1);
  413. QMap<QString,QString> mapSegments ;
  414. QMap<QString,QString> mapCityPhone ;
  415. if(this->isCity)
  416. mapSegments = SNCDataBase::groupSegmentIntoCity(segments);
  417. else
  418. mapSegments = SNCDataBase::groupSegmentIntoProvince(segments);
  419. emit progressUpdated(2);
  420. QMap<QString ,int > map;
  421. for(int i=0;i<segments.size();i++)
  422. {
  423. QString segment = segments.at(i);
  424. QString city = mapSegments.value(segment);
  425. if(city.isEmpty())
  426. city = "未知地区";
  427. map.insert(city,map.value(city)+numbers.at(i).size());
  428. for(int j=0;j<numbers.at(i).size();j++)
  429. {
  430. mapCityPhone[city] += segment+numbers.at(i).at(j) + "\r\n";
  431. }
  432. emit progressUpdated(i+3);
  433. }
  434. foreach(QString city, mapCityPhone.keys())
  435. {
  436. QFile file(fileNamePrefix+"_"+city+"_"+QString::number(map.value(city))+".txt");
  437. file.open(QIODevice::WriteOnly);
  438. QTextStream out(&file);
  439. out<<mapCityPhone.value(city);
  440. file.close();
  441. }
  442. emit exportFinished();
  443. }
  444. /*
  445. void NumberExport::exportByRegion()//export by city
  446. {
  447. QStringList segments;
  448. QList<QStringList> numbers;
  449. segments = this->model->getSegments();
  450. numbers = this->model->getNumbers();
  451. emit progressMaxUpdated(segments.size()+2);
  452. emit progressUpdated(1);
  453. QMap<QString,QString> mapSegments ;
  454. if(this->isCity)
  455. mapSegments = SNCDataBase::groupSegmentIntoCity(segments);
  456. else
  457. mapSegments = SNCDataBase::groupSegmentIntoProvince(segments);
  458. emit progressUpdated(2);
  459. QMap<QString ,int > map;
  460. for(int i=0;i<segments.size();i++)
  461. {
  462. QString segment = segments.at(i);
  463. QString city = mapSegments.value(segment);
  464. if(city.isEmpty())
  465. city = "未知地区";
  466. map.insert(city,map.value(city)+numbers.at(i).size());
  467. QFile file(fileNamePrefix+"_"+city+".txt");
  468. file.open(QIODevice::Append);
  469. QTextStream out(&file);
  470. for(int j=0;j<numbers.at(i).size();j++)
  471. {
  472. if(i==segments.size()-1 && j==numbers.at(i).size()-1)
  473. out<<segment+numbers.at(i).at(j);
  474. else
  475. out<<segment+numbers.at(i).at(j)<<"\r\n";
  476. }
  477. file.close();
  478. emit progressUpdated(i+3);
  479. }
  480. foreach(QString city,map.keys())
  481. {
  482. QFile::rename(fileNamePrefix+"_"+city+".txt",fileNamePrefix+"_"+city+"_"+QString::number(map.value(city))+".txt");
  483. }
  484. emit exportFinished();
  485. }*/