Utilisateur:Pamputt/Articles sans ref
Pour le compiler, tapez « g++ check_ref.cpp -o $HOME/bin/check_ref »
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char **argv) {
vector < string > filename;
// les dumps sont à téléchargé sur https://dumps.wikimedia.org/frwiki/20231101/
// prendre ceux qui contiennent « pages-meta-current » dans leur nom
// soit le fichier complet (attention fichiers de plusieurs dizaines de Gio une fois décompressé),
// soit tous les morceaux
filename.push_back("frwiki-20161101-pages-meta-current1.xml-p000000003p000412301");
filename.push_back("frwiki-20161101-pages-meta-current2.xml-p000412304p001647888");
filename.push_back("frwiki-20161101-pages-meta-current3.xml-p001647895p004419859");
filename.push_back("frwiki-20161101-pages-meta-current4.xml-p004419860p010395854");
ofstream ofile("output.txt");
if(!ofile) {
cerr << "Probleme avec le fichier de sortie" << endl;
return -1;
}
vector < string > vTitre;
long int Narticles=0;
string titre;
long int ref1=0;
for(unsigned int i=0 ; i<filename.size() ; i++) {
cout << "Traitement de " << filename[i] << " ..." << endl;
ifstream ifile(filename[i].c_str());
if(!ifile) {
cerr << "Probleme avec " << filename[i] << endl;
return -1;
}
string line;
while (getline(ifile,line)) {
if(line.find("<page>")!=string::npos) {
bool valide = true;
int ref=0;
// on recupere le contenu de <title>
getline(ifile,line);
if(line.find("<title>")!=string::npos) {
size_t pos = line.find("<title>");
titre = line.substr(pos+7,line.find("</title>")-pos-7);
//cout << "Titre: " << titre << endl;
}
// on verifie si ns=0, c'est-a-dire si l'article appartient a l'espace principal
getline(ifile,line);
if(line.find("<ns>")!=string::npos) {
size_t pos = line.find("<ns>");
string tmp = line.substr(pos+4,line.find("</ns>")-pos-4);
// cout << "ns = " << tmp << endl;
if(tmp!="0")
valide = false;
}
//et que ce n'est pas un redirect
getline(ifile,line); //<id>
getline(ifile,line); //<redirect
if(line.find("<redirect")!=string::npos)
valide = false;
// si c'est le cas, on continue
if(valide) {
Narticles++;
}
bool debut = false;
while(getline(ifile,line)) {
if(line.find("<text bytes=")!=string::npos)
debut = true;
if(line.find("</text>")!=string::npos)
break;
if(debut && line.find("</ref")!=string::npos) {
//cout << titre << endl << ">> " << line << endl;
ref++;
}
}
if (ref==0 && valide) {
vTitre.push_back(titre);
ofile << vTitre.back() << endl;
// cout << "> " << vTitre.back() << endl;
}
if(ref==1) ref1++;
}//fin de if(<page>)
}//fin de while(getline())
cout << vTitre.size() << " articles sans ref sur un total de " << Narticles << " soit " << vTitre.size()/(float)Narticles*100. << "%" << endl;
cout << " " << ref1 << " articles avec une seul ref sur un total de " << Narticles << " soit " << ref1/(float)Narticles*100. << "%" << endl;
}
return 1;
}