filecompare.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. #include "filecompare.h"
  2. FileCompare::FileCompare(QStringList fileNames, FileCompareType compareType)
  3. {
  4. this->fileNames = fileNames;
  5. this->compareType = compareType;
  6. if(this->compareType == Export2File || this->compareType == Export3File)
  7. {
  8. this->step1Progress = 20;
  9. this->step2Progress = 30;
  10. this->step3Progress = 50;
  11. }
  12. else if(this->compareType == IntegrateFile)
  13. {
  14. this->step1Progress = 100;
  15. }
  16. }
  17. FileCompare::~FileCompare()
  18. {
  19. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  20. <<"FileCompare Destroyed.";
  21. }
  22. void FileCompare::setModel(QList<NumberListModel *> modelList)
  23. {
  24. this->modelList = modelList;
  25. }
  26. void FileCompare::setExportDir(QString dir)
  27. {
  28. this->exportDir = dir;
  29. }
  30. void FileCompare::run()
  31. {
  32. switch(compareType)
  33. {
  34. case Export2File:
  35. export2File();
  36. break;
  37. case Export3File:
  38. export3File();
  39. break;
  40. case IntegrateFile:
  41. integrateFile();
  42. break;
  43. default:
  44. break;
  45. }
  46. //deleteLater();
  47. }
  48. void FileCompare::export2File()
  49. {
  50. emit progressMaxUpdated(100);
  51. QTime time;
  52. time.start();
  53. NumberListModel *modell;
  54. NumberListModel *model2;
  55. modell=modelList.at(0);//加载数据到内存
  56. model2=modelList.at(1);//加载数据到内存
  57. modell->mergeSegment();
  58. model2->mergeSegment();
  59. QStringList segments1,segments2;
  60. QList<QStringList> numbers1,numbers2;
  61. segments1 = modell->getSegments();
  62. segments2 = model2->getSegments();
  63. numbers1 = modell->getNumbers();
  64. numbers2 = model2->getNumbers();
  65. QString fileName1 = fileNames.at(0);
  66. QString fileName2 = fileNames.at(1);
  67. QFileInfo fileinfo1(fileName1);
  68. QFileInfo fileinfo2(fileName2);
  69. QStringList resultList;
  70. QString intersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_交集_.txt";
  71. QFile fileIntersection(intersection);
  72. if(!fileIntersection.open(QIODevice::WriteOnly))
  73. return ;
  74. QTextStream outIntersection(&fileIntersection);
  75. for(int i=0;i<segments1.size();i++)
  76. {
  77. double s1 = i+1;
  78. double s2 = segments1.size();
  79. emit progressUpdated(this->step1Progress*s1/s2);
  80. for(int j=0;j<segments2.size();j++)
  81. {
  82. if(segments1.at(i)==segments2.at(j))
  83. {
  84. //remove duplicate
  85. QStringList list;
  86. QString tmp;
  87. numbers1[i].sort();
  88. for(int k=0;k<numbers1.at(i).size();k++)
  89. {
  90. if (tmp != numbers1[i][k])
  91. {
  92. tmp = numbers1[i][k];
  93. list.append(tmp);
  94. }
  95. }
  96. numbers1[i] = list;
  97. list.clear();
  98. tmp = "";
  99. numbers2[j].sort();
  100. for(int k=0;k<numbers2.at(j).size();k++)
  101. {
  102. if (tmp != numbers2[j][k])
  103. {
  104. tmp = numbers2[j][k];
  105. list.append(tmp);
  106. }
  107. }
  108. numbers2[j] = list;
  109. list.clear();
  110. tmp = "";
  111. for(int k=0;k<numbers1.at(i).size();k++)
  112. {
  113. bool havesame=false;
  114. for(int l=0;l<numbers2.at(j).size();l++)
  115. {
  116. if(numbers1.at(i).at(k)==numbers2.at(j).at(l))
  117. {
  118. outIntersection << segments1.at(i)+numbers1.at(i).at(k)+"\r\n";//写交集文件
  119. numbers2[j].removeAt(l);
  120. numbers1[i].removeAt(k);
  121. havesame = true;
  122. break;
  123. }
  124. }
  125. if(havesame)
  126. k--;
  127. }
  128. }
  129. }
  130. }
  131. fileIntersection.close();
  132. resultList<<intersection;
  133. QString removeIntersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_去除交集_.txt";
  134. QFile fileRemoveIntersection(removeIntersection);
  135. if(!fileRemoveIntersection.open(QIODevice::WriteOnly))
  136. return ;
  137. QTextStream outFileRemoveIntersection(&fileRemoveIntersection);
  138. for(int i=0;i<segments1.size();i++)
  139. {
  140. double s1 = i+1;
  141. double s2 = segments1.size();
  142. emit progressUpdated(this->step1Progress+this->step2Progress*s1/s2);
  143. for(int j=0;j<numbers1.at(i).size();j++)
  144. {
  145. outFileRemoveIntersection << segments1.at(i)+numbers1.at(i).at(j)+ "\r\n";
  146. }
  147. }
  148. for(int i=0;i<segments2.size();i++)
  149. {
  150. double s1 = i+1;
  151. double s2 = segments1.size();
  152. emit progressUpdated(this->step1Progress+this->step2Progress+this->step3Progress*s1/s2);
  153. for(int j=0;j<numbers2.at(i).size();j++)
  154. {
  155. outFileRemoveIntersection << segments2.at(i)+numbers2.at(i).at(j)+ "\r\n";
  156. }
  157. }
  158. fileRemoveIntersection.close();
  159. resultList<<removeIntersection;
  160. emit progressUpdated(this->step1Progress+step2Progress+step3Progress);
  161. emit fileCompared(resultList);
  162. }
  163. void FileCompare::export3File()
  164. {
  165. emit progressMaxUpdated(100);
  166. QTime time;
  167. time.start();
  168. NumberListModel *modell;
  169. NumberListModel *model2;
  170. modell=modelList.at(0);//加载数据到内存
  171. model2=modelList.at(1);//加载数据到内存
  172. modell->mergeSegment();
  173. model2->mergeSegment();
  174. QStringList segments1,segments2;
  175. QList<QStringList> numbers1,numbers2;
  176. segments1 = modell->getSegments();
  177. segments2 = model2->getSegments();
  178. numbers1 = modell->getNumbers();
  179. numbers2 = model2->getNumbers();
  180. QString fileName1 = fileNames.at(0);
  181. QString fileName2 = fileNames.at(1);
  182. QFileInfo fileinfo1(fileName1);
  183. QFileInfo fileinfo2(fileName2);
  184. QStringList resultList;
  185. QString intersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_交集_.txt";
  186. QFile fileIntersection(intersection);
  187. if(!fileIntersection.open(QIODevice::WriteOnly))
  188. return ;
  189. QTextStream outIntersection(&fileIntersection);
  190. for(int i=0;i<segments1.size();i++)
  191. {
  192. double s1 = i+1;
  193. double s2 = segments1.size();
  194. emit progressUpdated(this->step1Progress*s1/s2);
  195. for(int j=0;j<segments2.size();j++)
  196. {
  197. if(segments1.at(i)==segments2.at(j))
  198. {
  199. //remove duplicate
  200. QStringList list;
  201. QString tmp;
  202. numbers1[i].sort();
  203. for(int k=0;k<numbers1.at(i).size();k++)
  204. {
  205. if (tmp != numbers1[i][k])
  206. {
  207. tmp = numbers1[i][k];
  208. list.append(tmp);
  209. }
  210. }
  211. numbers1[i] = list;
  212. list.clear();
  213. tmp="";
  214. numbers2[j].sort();
  215. for(int k=0;k<numbers2.at(j).size();k++)
  216. {
  217. if (tmp != numbers2[j][k])
  218. {
  219. tmp = numbers2[j][k];
  220. list.append(tmp);
  221. }
  222. }
  223. numbers2[j] = list;
  224. list.clear();
  225. tmp = "";
  226. for(int k=0;k<numbers1.at(i).size();k++)
  227. {
  228. bool havesame=false;
  229. for(int l=0;l<numbers2.at(j).size();l++)
  230. {
  231. if(numbers1.at(i).at(k)==numbers2.at(j).at(l))
  232. {
  233. outIntersection << segments1.at(i)+numbers1.at(i).at(k)+"\r\n";//写交集文件
  234. numbers2[j].removeAt(l);
  235. numbers1[i].removeAt(k);
  236. havesame = true;
  237. break;
  238. }
  239. }
  240. if(havesame)
  241. k--;
  242. }
  243. }
  244. }
  245. }
  246. fileIntersection.close();
  247. resultList<<intersection;
  248. QString removeIntersection1 = this->exportDir+"/"+fileinfo1.baseName()+"_去除交集_.txt";
  249. QFile fileRemoveIntersection1(removeIntersection1);
  250. if(!fileRemoveIntersection1.open(QIODevice::WriteOnly))
  251. return ;
  252. QTextStream outRemoveIntersection1(&fileRemoveIntersection1);
  253. for(int i=0;i<segments1.size();i++)
  254. {
  255. double s1 = i+1;
  256. double s2 = segments1.size();
  257. emit progressUpdated(this->step1Progress+step2Progress*s1/s2);
  258. for(int j=0;j<numbers1.at(i).size();j++)
  259. {
  260. outRemoveIntersection1<<segments1.at(i)+numbers1.at(i).at(j)+"\r\n";
  261. }
  262. }
  263. fileRemoveIntersection1.close();
  264. resultList<<removeIntersection1;
  265. QString removeIntersection2 = this->exportDir+"/"+fileinfo2.baseName()+"_去除交集_.txt";
  266. QFile fileRemoveIntersection2(removeIntersection2);
  267. if(!fileRemoveIntersection2.open(QIODevice::WriteOnly))
  268. return ;
  269. QTextStream outRemoveIntersection2(&fileRemoveIntersection2);
  270. for(int i=0;i<segments2.size();i++)
  271. {
  272. double s1 = i+1;
  273. double s2 = segments2.size();
  274. emit progressUpdated(this->step1Progress+step2Progress+step3Progress*s1/s2);
  275. for(int j=0;j<numbers2.at(i).size();j++)
  276. {
  277. outRemoveIntersection2<<segments2.at(i)+numbers2.at(i).at(j)+"\r\n";
  278. }
  279. }
  280. emit progressUpdated(this->step1Progress+step2Progress+step3Progress);
  281. fileRemoveIntersection2.close();
  282. resultList<<removeIntersection2;
  283. emit fileCompared(resultList);
  284. }
  285. void FileCompare::integrateFile()
  286. {
  287. emit progressMaxUpdated(100);
  288. QStringList resultList;
  289. QFile file(this->exportDir+"/"+"整合后文件.txt");
  290. resultList<<this->exportDir+"/"+"整合后文件.txt";
  291. if(!file.open(QIODevice::WriteOnly))
  292. return ;
  293. int counter = 0;
  294. for(int i=0;i<modelList.size();i++)
  295. {
  296. counter += modelList.at(i)->getCount();
  297. }
  298. int progress = 0;
  299. QTextStream out(&file);
  300. for(int i=0;i<modelList.size();i++)
  301. {
  302. NumberListModel *model = modelList[i];
  303. for(int j=0;j<model->getSegments().size();j++)
  304. {
  305. QString segment = model->getSegments().at(j);
  306. for(int k=0;k<model->getNumbers().at(j).size();k++ )
  307. {
  308. QString number = model->getNumbers().at(j).at(k);
  309. out<<segment+number<<"\r\n";
  310. progress++;
  311. if((progress%100000==0 && progress/100000>0)||progress>=counter)
  312. {
  313. double s1 = progress;
  314. double s2 = counter;
  315. emit progressUpdated(this->step1Progress*s1/s2);
  316. }
  317. }
  318. }
  319. }
  320. file.close();
  321. emit progressUpdated(this->step1Progress);
  322. emit fileIntegrated(resultList);
  323. }