| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- #include "filecompare.h"
- FileCompare::FileCompare(QStringList fileNames, FileCompareType compareType)
- {
- this->fileNames = fileNames;
- this->compareType = compareType;
- if(this->compareType == Export2File || this->compareType == Export3File)
- {
- this->step1Progress = 20;
- this->step2Progress = 30;
- this->step3Progress = 50;
- }
- else if(this->compareType == IntegrateFile)
- {
- this->step1Progress = 100;
- }
- }
- FileCompare::~FileCompare()
- {
- qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
- <<"FileCompare Destroyed.";
- }
- void FileCompare::setModel(QList<NumberListModel *> modelList)
- {
- this->modelList = modelList;
- }
- void FileCompare::setExportDir(QString dir)
- {
- this->exportDir = dir;
- }
- void FileCompare::run()
- {
- switch(compareType)
- {
- case Export2File:
- export2File();
- break;
- case Export3File:
- export3File();
- break;
- case IntegrateFile:
- integrateFile();
- break;
- default:
- break;
- }
- //deleteLater();
- }
- void FileCompare::export2File()
- {
- emit progressMaxUpdated(100);
- QTime time;
- time.start();
- NumberListModel *modell;
- NumberListModel *model2;
- modell=modelList.at(0);//加载数据到内存
- model2=modelList.at(1);//加载数据到内存
- modell->mergeSegment();
- model2->mergeSegment();
- QStringList segments1,segments2;
- QList<QStringList> numbers1,numbers2;
- segments1 = modell->getSegments();
- segments2 = model2->getSegments();
- numbers1 = modell->getNumbers();
- numbers2 = model2->getNumbers();
- QString fileName1 = fileNames.at(0);
- QString fileName2 = fileNames.at(1);
- QFileInfo fileinfo1(fileName1);
- QFileInfo fileinfo2(fileName2);
- QStringList resultList;
- QString intersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_交集_.txt";
- QFile fileIntersection(intersection);
- if(!fileIntersection.open(QIODevice::WriteOnly))
- return ;
- QTextStream outIntersection(&fileIntersection);
- for(int i=0;i<segments1.size();i++)
- {
- double s1 = i+1;
- double s2 = segments1.size();
- emit progressUpdated(this->step1Progress*s1/s2);
- for(int j=0;j<segments2.size();j++)
- {
- if(segments1.at(i)==segments2.at(j))
- {
- //remove duplicate
- QStringList list;
- QString tmp;
- numbers1[i].sort();
- for(int k=0;k<numbers1.at(i).size();k++)
- {
- if (tmp != numbers1[i][k])
- {
- tmp = numbers1[i][k];
- list.append(tmp);
- }
- }
- numbers1[i] = list;
- list.clear();
- tmp = "";
- numbers2[j].sort();
- for(int k=0;k<numbers2.at(j).size();k++)
- {
- if (tmp != numbers2[j][k])
- {
- tmp = numbers2[j][k];
- list.append(tmp);
- }
- }
- numbers2[j] = list;
- list.clear();
- tmp = "";
- for(int k=0;k<numbers1.at(i).size();k++)
- {
- bool havesame=false;
- for(int l=0;l<numbers2.at(j).size();l++)
- {
- if(numbers1.at(i).at(k)==numbers2.at(j).at(l))
- {
- outIntersection << segments1.at(i)+numbers1.at(i).at(k)+"\r\n";//写交集文件
- numbers2[j].removeAt(l);
- numbers1[i].removeAt(k);
- havesame = true;
- break;
- }
- }
- if(havesame)
- k--;
- }
- }
- }
- }
- fileIntersection.close();
- resultList<<intersection;
- QString removeIntersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_去除交集_.txt";
- QFile fileRemoveIntersection(removeIntersection);
- if(!fileRemoveIntersection.open(QIODevice::WriteOnly))
- return ;
- QTextStream outFileRemoveIntersection(&fileRemoveIntersection);
- for(int i=0;i<segments1.size();i++)
- {
- double s1 = i+1;
- double s2 = segments1.size();
- emit progressUpdated(this->step1Progress+this->step2Progress*s1/s2);
- for(int j=0;j<numbers1.at(i).size();j++)
- {
- outFileRemoveIntersection << segments1.at(i)+numbers1.at(i).at(j)+ "\r\n";
- }
- }
- for(int i=0;i<segments2.size();i++)
- {
- double s1 = i+1;
- double s2 = segments1.size();
- emit progressUpdated(this->step1Progress+this->step2Progress+this->step3Progress*s1/s2);
- for(int j=0;j<numbers2.at(i).size();j++)
- {
- outFileRemoveIntersection << segments2.at(i)+numbers2.at(i).at(j)+ "\r\n";
- }
- }
- fileRemoveIntersection.close();
- resultList<<removeIntersection;
- emit progressUpdated(this->step1Progress+step2Progress+step3Progress);
- emit fileCompared(resultList);
- }
- void FileCompare::export3File()
- {
- emit progressMaxUpdated(100);
- QTime time;
- time.start();
- NumberListModel *modell;
- NumberListModel *model2;
- modell=modelList.at(0);//加载数据到内存
- model2=modelList.at(1);//加载数据到内存
- modell->mergeSegment();
- model2->mergeSegment();
- QStringList segments1,segments2;
- QList<QStringList> numbers1,numbers2;
- segments1 = modell->getSegments();
- segments2 = model2->getSegments();
- numbers1 = modell->getNumbers();
- numbers2 = model2->getNumbers();
- QString fileName1 = fileNames.at(0);
- QString fileName2 = fileNames.at(1);
- QFileInfo fileinfo1(fileName1);
- QFileInfo fileinfo2(fileName2);
- QStringList resultList;
- QString intersection = this->exportDir+"/"+fileinfo1.baseName()+"_"+fileinfo2.baseName()+"_交集_.txt";
- QFile fileIntersection(intersection);
- if(!fileIntersection.open(QIODevice::WriteOnly))
- return ;
- QTextStream outIntersection(&fileIntersection);
- for(int i=0;i<segments1.size();i++)
- {
- double s1 = i+1;
- double s2 = segments1.size();
- emit progressUpdated(this->step1Progress*s1/s2);
- for(int j=0;j<segments2.size();j++)
- {
- if(segments1.at(i)==segments2.at(j))
- {
- //remove duplicate
- QStringList list;
- QString tmp;
- numbers1[i].sort();
- for(int k=0;k<numbers1.at(i).size();k++)
- {
- if (tmp != numbers1[i][k])
- {
- tmp = numbers1[i][k];
- list.append(tmp);
- }
- }
- numbers1[i] = list;
- list.clear();
- tmp="";
- numbers2[j].sort();
- for(int k=0;k<numbers2.at(j).size();k++)
- {
- if (tmp != numbers2[j][k])
- {
- tmp = numbers2[j][k];
- list.append(tmp);
- }
- }
- numbers2[j] = list;
- list.clear();
- tmp = "";
- for(int k=0;k<numbers1.at(i).size();k++)
- {
- bool havesame=false;
- for(int l=0;l<numbers2.at(j).size();l++)
- {
- if(numbers1.at(i).at(k)==numbers2.at(j).at(l))
- {
- outIntersection << segments1.at(i)+numbers1.at(i).at(k)+"\r\n";//写交集文件
- numbers2[j].removeAt(l);
- numbers1[i].removeAt(k);
- havesame = true;
- break;
- }
- }
- if(havesame)
- k--;
- }
- }
- }
- }
- fileIntersection.close();
- resultList<<intersection;
- QString removeIntersection1 = this->exportDir+"/"+fileinfo1.baseName()+"_去除交集_.txt";
- QFile fileRemoveIntersection1(removeIntersection1);
- if(!fileRemoveIntersection1.open(QIODevice::WriteOnly))
- return ;
- QTextStream outRemoveIntersection1(&fileRemoveIntersection1);
- for(int i=0;i<segments1.size();i++)
- {
- double s1 = i+1;
- double s2 = segments1.size();
- emit progressUpdated(this->step1Progress+step2Progress*s1/s2);
- for(int j=0;j<numbers1.at(i).size();j++)
- {
- outRemoveIntersection1<<segments1.at(i)+numbers1.at(i).at(j)+"\r\n";
- }
- }
- fileRemoveIntersection1.close();
- resultList<<removeIntersection1;
- QString removeIntersection2 = this->exportDir+"/"+fileinfo2.baseName()+"_去除交集_.txt";
- QFile fileRemoveIntersection2(removeIntersection2);
- if(!fileRemoveIntersection2.open(QIODevice::WriteOnly))
- return ;
- QTextStream outRemoveIntersection2(&fileRemoveIntersection2);
- for(int i=0;i<segments2.size();i++)
- {
- double s1 = i+1;
- double s2 = segments2.size();
- emit progressUpdated(this->step1Progress+step2Progress+step3Progress*s1/s2);
- for(int j=0;j<numbers2.at(i).size();j++)
- {
- outRemoveIntersection2<<segments2.at(i)+numbers2.at(i).at(j)+"\r\n";
- }
- }
- emit progressUpdated(this->step1Progress+step2Progress+step3Progress);
- fileRemoveIntersection2.close();
- resultList<<removeIntersection2;
- emit fileCompared(resultList);
- }
- void FileCompare::integrateFile()
- {
- emit progressMaxUpdated(100);
- QStringList resultList;
- QFile file(this->exportDir+"/"+"整合后文件.txt");
- resultList<<this->exportDir+"/"+"整合后文件.txt";
- if(!file.open(QIODevice::WriteOnly))
- return ;
- int counter = 0;
- for(int i=0;i<modelList.size();i++)
- {
- counter += modelList.at(i)->getCount();
- }
- int progress = 0;
- QTextStream out(&file);
- for(int i=0;i<modelList.size();i++)
- {
- NumberListModel *model = modelList[i];
- for(int j=0;j<model->getSegments().size();j++)
- {
- QString segment = model->getSegments().at(j);
- for(int k=0;k<model->getNumbers().at(j).size();k++ )
- {
- QString number = model->getNumbers().at(j).at(k);
- out<<segment+number<<"\r\n";
- progress++;
- if((progress%100000==0 && progress/100000>0)||progress>=counter)
- {
- double s1 = progress;
- double s2 = counter;
- emit progressUpdated(this->step1Progress*s1/s2);
- }
- }
- }
- }
- file.close();
- emit progressUpdated(this->step1Progress);
- emit fileIntegrated(resultList);
- }
|