IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

récupération de données d'un fichier .txt


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 1
    Par défaut récupération de données d'un fichier .txt
    Bonjour,

    je cherche a récupérer (extraire) des chaines de caractères d'un fichier .txt.

    exemple:

    Je possède un code source de page web dans un fichier .txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <meta charset="utf-8">
    <meta name="description" content="AniChart | The Best Place For Finding Upcoming Anime">
    <meta name="keywords" content="Anime,Chart">
    et je souhaite récupérer dans une variable juste : "AniChart | The Best Place For Finding Upcoming Anime".
    Mais voila je n'ai aucune idée de comment faire et je ne trouve rien sur le net comme réponse a ma question.

    Merci d'avance.

    Cordialement

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Soit tu utilises un parser html, soit tu la récupère à la main.

    à la main, tu as intérêt à utiliser std::getline(stream, string&, char délimiteur).
    En effet, l'html peut ne pas contenir de "\n" aux bons endroits.
    L'idée sera d'utiliser '<' comme délimiteur, puisque tu sais que seules les balises commencent avec.

    Ton code ressemblera à la lecture ligne à ligne, mais par balises (ouvrante ou fermante).
    les chaines lues commenceront par le nom de la balise et il suffira d'extraire la chaine voulue via une regex (en faisant attention aux \" éventuellement présents)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //analyse des chaines telles que: <meta name="description" content="AniChart | The Best Place For Finding Upcoming Anime">
    std::string extract_meta(istream& source, std::string const& name) {
        std::string balise;
        while (std::getline(source, balise, '<') {
            if (balise.substr(0,4)!="meta") continue;
            if (balise.find("name=\""+name+'\"')==std::string::npos ) continue;
            //pseudocode
            retourner la valeur de content avec une regex d'extraction proche de: "content\"(.*)\"
        }
        return "";
    }
    Ce n'est pas la solution idéale pour lire plusieurs méta, parce que le stream sera modifié.
    Dans ce cas, il faudrait plutôt créer une classe de méta, et parser un vecteur de meta.
    Une méta étant essentiellement descriptible comme une map d'attributs, eux différentes normes html près.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Il doit bien y avoir des classes gérant les expressions régulières en c++.

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Oui, <regex> à partir de C++11.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est juste qu'une regex à l'aveugle sur un fichier html complet, tu ne vas jamais t'en sortir.
    C'est pour ca que, dans ce cadre précis, getline() par balise est utile pour réduire la zone analysée

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 9

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Je suis d'accord avec leternel, la regex est plutôt une mauvaise idée ici. Un parseur XML n'est pas forcément l'idéal non plus si le HTML a le malheur d'être mal formé, ce qui est souvent le cas

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Ouais m'enfin si on part du principe que tout peut être potentiellement mal formaté on finit par extraire nos données à la main

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par the Hound Voir le message
    Ouais m'enfin si on part du principe que tout peut être potentiellement mal formaté on finit par extraire nos données à la main
    Je suis d'accord avec toi mais en ce qui concerne le HTML, c'est plus que courant qu'il soit mal formaté, parce que les navigateurs le supporte quand même. Dans la plupart des autres cas, si tu as de la donnée mal formatée, tu as un système en panne. Pas là, d'où le conseil :p.

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En fait, c'est même pire que ca, l'HTML mal formaté fait partie de la norme HTML (la norme 4, en tout cas) et qu'en l'abscence de doctype, on ne sait pas quelle est la norme suivie.

    Il y a encore deux ans, c'était une possibilité voulue.
    En HTML5, ce n'est plus toléré, mais il faut un doctype précis pour être en html5

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Salut,

    pour moi la regexp reste le meilleur moyen de s'en sortir.
    Je suis plus habitué à les manipuler en Python, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    meta.*?name="description".*?content="(.*?)"
    Tu peux tester son résultat ici : http://www.pythonregex.com/

    Avec celle-ci et l'option Dot All, tu retrouves ta chaîne quelle qu'elle soit. La balise peut être sur plusieurs lignes etc, pas trop de problème à priori. Idem si son contenu est sur plusieurs lignes, il retombera sur ses pattes. Sinon tu tweak.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2014
    Messages : 17
    Par défaut
    bonjour,

    je suis novice en PHP et j'ai le même désir.

    j'ai un fichier.txt avec des données et je souhaite récupérer certaines lignes pour ma base de données et je ne sais pas du tout comment faire malgré plusieurs réponses trouver sur le net . Merci

  13. #13
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Bonjour,

    Dans ce cas, crée ton propre thread sur le forum dédié à PHP.

  14. #14
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu es complètement au mauvais endroit. Pose ta question dans le forum PHP.
    Mes souvenirs de PHP ne contiennent même pas d'accès fichier

    Cela dit, la logique devrait être la même.
    1. s'assurer que quoiqu'il arrive, si le fichier est ouvert, il sera fermé,
    2. ouvrir le fichier,
    3. tant que c'est possible, lire une ligne.
    4. sauter les lignes vides
    5. éventuellement, supprimer les commentaires
    6. utiliser la ligne.
    7. revenir au point 3


    Il suffit pour avoir un parseur efficace, de concevoir une petite machine à états qui suivra la lecture (souvent init & data: un simple booléen suffit)

Discussions similaires

  1. Récupération des données d'un fichier txt
    Par Angelive dans le forum C++
    Réponses: 3
    Dernier message: 15/09/2012, 19h03
  2. Réponses: 5
    Dernier message: 12/04/2011, 15h42
  3. Récupération de données dans un fichier .txt
    Par Crackos dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/09/2010, 14h15
  4. Réponses: 6
    Dernier message: 20/01/2008, 16h32
  5. Récupération des données d'un fichier .txt
    Par vincou dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/07/2007, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo