Utilisateur:Pamputt/Articles sans ref

Une page de Wikipédia, l'encyclopédie libre.

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("&lt;/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;
}