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

Langage PHP Discussion :

Parser un fichier .txt


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut Parser un fichier .txt
    Bonjour,

    Chaque mois je reçois un document texte.txt contenant toujours une même hiérarchie d'informations.
    Actuellement ce que je fais, c'est du copier/coller. Mais c'est long.
    J'ai alors pensé à parser mon document afin d'isoler tout le contenu utile dans un tableau.
    une fois avec mon tableau, je pourrais travailler alors avec lui et recomposer mes pages comme bon me semble.

    exemple de document à parser:
    <toile/>
    <date> 31 août 2015 </date>

    <titre>Mais qui est John Doe?</titre>

    oeuvre conçue par <artiste>John Doe</artiste>


    <texte>En anglais, John Doe (version féminine : Jane Doe) est une expression pouvant désigner une personne non-identifiée ou un homme de la rue : « Monsieur X », « Monsieur Untel », « Monsieur Durand », « Monsieur Tout-le-monde », « un citoyen Lambda ».
    Dans de nombreux pays, on constate que le nom employé comme nom générique n'est pas le nom réellement le plus répandu. Dans les pays anglophones, le nom le plus courant est généralement considéré comme étant John Smith ou M. Smith, tandis qu'en France et en Espagne le nom le plus courant est Martin, et au Québec il s'agit de Tremblay (source wikipédia ).
    </texte>

    <infos>
    Œuvre : John doe
    technique : mixte
    Couleur dominante : Bleu Prusse
    Format de la toile : Carré 120cm x 120cm
    prix : tant d'€
    </infos>



    <da>John Doe et trucmuch</da> animera une séance de dédicaces <dh>le samedi 29 août 2015 de 10h à 12h</dh>à <dl>lieu étrange</dl>

    Infos pratiques
    Nullam dictum felis eu pede mollis pretium. Cras sagittis.

    Nullam quis ante. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis.

    <vernissage>Le samedi 29 août 2015 de 10h à 18h</vernissage> <adr>1 rue du nulle part , 75000 Paris</adr>.

    Nullam dictum felis eu pede mollis pretium. Cras sagittis.

    Nullam quis ante. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis.
    il ya deux styles de balise:

    fermante et autofermante
    l'autofermante indique un noeud parent et les balises fermantes classiques sont ses enfants
    voici la représentation du texte ci dessus dans un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $tableau=['toile'=>[
    					'date'=>'31 août 2015',
    					'titre'=>'Mais qui est John Doe?',
    					'artiste'=>'John Doe',
    					'texte'=>'En anglais, John Doe (version féminine : Jane Doe) est une expression pouvant désigner une personne non-identifiée ou un homme de la rue : « Monsieur X », « Monsieur Untel », « Monsieur Durand », « Monsieur Tout-le-monde », « un citoyen Lambda ». Dans de nombreux pays, on constate que le nom employé comme nom générique n\'est pas le nom réellement le plus répandu. Dans les pays anglophones, le nom le plus courant est généralement considéré comme étant John Smith ou M. Smith, tandis qu\'en France et en Espagne le nom le plus courant est Martin, et au Québec il s\'agit de Tremblay (source wikipédia ).',
    					'infos'=>'Œuvre : John doe technique : mixte Couleur dominante : Bleu Prusse Format de la toile : Carré 120cm x 120cm prix : tant d\'€',
    					'da'=>'John Doe et trucmuch',
    					'dh'=>'le samedi 29 août 2015 de 10h à 12h',
    					'dl'=>'lieu étrange',
    					'vernissage'=>'Le samedi 29 août 2015 de 10h à 18h',
    					'adr'=>'1 rue du nulle part , 75000 Paris']
    					];
    pour cet exemple je me limite à un seul sous tableau(toile), dans la réalité j'aurais + d'une toile et d'autres choses comme </gravure> </esquisse>, au grand maximum 15 sous tableaux.

    Que pensez-vous de cette approche?
    Avez-vous une autre solution à me proposer?

    merci pour votre aide

    Amicalement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    voilà qui semble faire la farce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    // -----------------------------------
    function parser_file($file)
    {
    	$doc = new DOMDocument();
    	@$doc->loadHTMLFile($file);
     
    	$section_array	= array('toile','gravure','esquisse'); // ajouter ici les futures sections
    	$not_in_array	= array('html','body');
    	$result_array	= array();
    	$index = '';
     
    	$elements = $doc->getElementsByTagName('*');
    	if (!is_null($elements)) 
    	{
    		foreach ($elements as $element) 
    		{
    			if(in_array($element->nodeName, $section_array)){ 
    				$index = $element->nodeName; 
    			} elseif(!in_array($element->nodeName, $not_in_array)){ 
    				$result_array[$index][$element->nodeName] = utf8_decode($element->nodeValue); // (à voir en fonction de l'encodage des fichiers)
    			}
    		}
    	}
    	return $result_array;
    }
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    // -----------------------------------
    $file = 'texte.txt';
    $tableau = parser_file($file);
    if(!empty($tableau))
    {
    	echo'<pre>'; print_r($tableau); echo'</pre>'; 
    }
    else {
    	echo 'rien trouvé.';
    }
    // -----------------------------------
    ?>
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Array
    (
        [toile] => Array
            (
                [date] =>  31 août 2015 
                [titre] => Mais qui est John Doe?
                [artiste] => John Doe
                [texte] => En anglais, John Doe (version féminine : Jane Doe) est une expression pouvant désigner une personne non-identifiée ou un homme de la rue : « Monsieur X », « Monsieur Untel », « Monsieur Durand », « Monsieur Tout-le-monde », « un citoyen Lambda ».
    Dans de nombreux pays, on constate que le nom employé comme nom générique n'est pas le nom réellement le plus répandu. Dans les pays anglophones, le nom le plus courant est généralement considéré comme étant John Smith ou M. Smith, tandis qu'en France et en Espagne le nom le plus courant est Martin, et au Québec il s'agit de Tremblay (source wikipédia ).
     
                [infos] => 
    Œuvre : John doe
    technique : mixte
    Couleur dominante : Bleu Prusse
    Format de la toile : Carré 120cm x 120cm
    prix : tant d'€
     
                [da] => John Doe et trucmuch
                [dh] => le samedi 29 août 2015 de 10h à 12h
                [dl] => lieu étrange
                [vernissage] => Le samedi 29 août 2015 de 10h à 18h
                [adr] => 1 rue du nulle part , 75000 Paris
            )
     
    )

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Vous êtes formidable,
    Merci ;-)

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Le retour!

    Merci encore une fois à Jreaux pour la solution.
    Mais je me heurte à un nouveau problème surlequel je coince depuis quelques temps:
    si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <toile>
         <enfant1.1>
         <enfant1.2>
         <etc1.n...>
    le cas suivant ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <toile>
         <enfant1.1>
         <enfant1.2>
         <etc1.n...>
     
    <toile>
         <enfant2.1>
         <enfant2.2>
         <etc2.n...>
    Car dans la finalité toile devient une clef dans mon tableau, et comme le doublon de clef est impossible , seule la dernière clef identique à une autre est prise en considération.
    Je souhaiterai en amont de mon tableau créer une condition pour vérifier si index=doc->nodeName est unique et cas échéant l'incrémenter de +1.
    C'est là où je galère...

    Merci pour vos conseils.

    Cordialement.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pourquoi se casser la tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    // -----------------------------------
    function parser_file($file)
    {
    	$doc = new DOMDocument();
    	@$doc->loadHTMLFile($file);
     
    	$section_array	= array('toile','gravure','esquisse'); // ajouter ici les futures sections
    	$not_in_array	= array('html','body');
    	$result_array	= array();
    	$index = '';
    	$num = 0;
     
    	$elements = $doc->getElementsByTagName('*');
    	if (!is_null($elements)) 
    	{
    		foreach ($elements as $element) 
    		{
    			if(in_array($element->nodeName, $section_array)){ 
    				$index = $num.'-'.$element->nodeName; 
    				$num++;
    			} elseif(!in_array($element->nodeName, $not_in_array)){ 
    				$result_array[$index][$element->nodeName] = utf8_decode($element->nodeValue); // (à voir en fonction de l'encodage des fichiers)
    			}
    		}
    	}
    	return $result_array;
    }
    ?>

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Jreaux62 merci pour votre aide.

    En fait je galère pas mal là... une nouvelle problématique vient se rajouter.
    Je me suis inspiré de votre script pour le faire évoluer... mais je n'y arrive pas.

    Si je rajoute une condition, du type :
    - toile-souscatégorie-elements
    en sachant que la sous catégorie n'est pas forcément obligatoire. dans mon fichier je peux trouver selon la forme d'origine qui est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <toile/>
    <souscategorie> ma souscatégorie1</soucatégorie>
    <date> 31 août 2015 </date>
    <titre>Mais qui est John Doe1-1?</titre>
    oeuvre conçue par <artiste>John Doe1-1</artiste>
     
    <souscategorie> ma sous catégorie2</soucatégorie>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe1-2?</titre>
     
    oeuvre conçue par <artiste>John Doe1-2</artiste>
    -----
    <toile/>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe2?</titre>
     
    oeuvre conçue par <artiste>John Doe2</artiste>
    Moi qui commençais à croire que j'avais un niveau pas trop mauvais en PHP en manipulant des objets, quand je vois le mal que j'ai sur des fondamentaux, ce constat d'échec me laisse perplexe...

    merci pour votre aide, encore une fois.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <souscategorie> ma souscatégorie1</soucatégorie>
    Ferme correctement les balises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <souscategorie> ma souscatégorie1</souscategorie>
    Voici une petite modif. qui permet de regrouper les catégories :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    // -----------------------------------
    function parser_file($file)
    {
    	$doc = new DOMDocument();
    	@$doc->loadHTMLFile($file);
     
    	$section_array	= array('toile','gravure','esquisse'); // ajouter ici les futures sections
    	$not_in_array	= array('html','body');
    	$result_array	= array();
    	$index = '';
    	$num = 0;
     
    	$elements = $doc->getElementsByTagName('*');
    	if (!is_null($elements)) 
    	{
    		foreach ($elements as $element) 
    		{
    			if(in_array($element->nodeName, $section_array)){ 
    				$index = $element->nodeName; 
    				$num++;
    			} elseif(!in_array($element->nodeName, $not_in_array)){ 
    				$result_array[$index][$num][$element->nodeName] = utf8_decode($element->nodeValue); // (à voir en fonction de l'encodage des fichiers)
    			}
    		}
    	}
    	return $result_array;
    }
    ?>
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <toile/>
    <souscategorie> ma souscatégorie1</souscategorie>
    <date> 31 août 2015 </date>
    <titre>Mais qui est John Doe1-1?</titre>
    oeuvre conçue par <artiste>John Doe1-1</artiste>
     
    <souscategorie> ma sous catégorie2</souscategorie>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe1-2?</titre>
     
    oeuvre conçue par <artiste>John Doe1-2</artiste>
    -----
    <toile/>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe2?</titre>
     
    oeuvre conçue par <artiste>John Doe2</artiste>
    -----
    <gravure/>
    <souscategorie> ma souscatégorie1</souscategorie>
    <date> 31 août 2015 </date>
    <titre>Mais qui est John Doe1-1?</titre>
    oeuvre conçue par <artiste>John Doe1-1</artiste>
     
    <souscategorie> ma sous catégorie2</souscategorie>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe1-2?</titre>
     
    oeuvre conçue par <artiste>John Doe1-2</artiste>
    -----
    <toile/>
    <souscategorie> ma souscatégorie1</souscategorie>
    <date> 31 août 2015 </date>
    <titre>Mais qui est John Doe1-1?</titre>
    oeuvre conçue par <artiste>John Doe1-1</artiste>
     
    <souscategorie> ma sous catégorie2</souscategorie>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe1-2?</titre>
     
    oeuvre conçue par <artiste>John Doe1-2</artiste>
    -----
    <esquisse/>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe2?</titre>
     
    oeuvre conçue par <artiste>John Doe2</artiste>
    -----
    <gravure/>
    <souscategorie> ma souscatégorie1</souscategorie>
    <date> 31 août 2015 </date>
    <titre>Mais qui est John Doe1-1?</titre>
    oeuvre conçue par <artiste>John Doe1-1</artiste>
     
    <souscategorie> ma sous catégorie2</souscategorie>
    <date> 31 août 2015 </date>
     
    <titre>Mais qui est John Doe1-2?</titre>
     
    oeuvre conçue par <artiste>John Doe1-2</artiste>
    -----
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Array
    (
        [toile] => Array
            (
                [1] => Array
                    (
                        [souscategorie] =>  ma sous catégorie2
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe1-2?
                        [artiste] => John Doe1-2
                    )
     
                [2] => Array
                    (
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe2?
                        [artiste] => John Doe2
                    )
     
                [4] => Array
                    (
                        [souscategorie] =>  ma sous catégorie2
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe1-2?
                        [artiste] => John Doe1-2
                    )
     
            )
     
        [gravure] => Array
            (
                [3] => Array
                    (
                        [souscategorie] =>  ma sous catégorie2
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe1-2?
                        [artiste] => John Doe1-2
                    )
     
                [6] => Array
                    (
                        [souscategorie] =>  ma sous catégorie2
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe1-2?
                        [artiste] => John Doe1-2
                    )
     
            )
     
        [esquisse] => Array
            (
                [5] => Array
                    (
                        [date] =>  31 août 2015 
                        [titre] => Mais qui est John Doe2?
                        [artiste] => John Doe2
                    )
     
            )
     
    )
    Dernière modification par Invité ; 15/10/2015 à 14h27.

Discussions similaires

  1. parser un fichier *.txt
    Par blaise4714 dans le forum Langage
    Réponses: 9
    Dernier message: 04/03/2009, 15h53
  2. Script shell pour parser un fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/09/2008, 09h32
  3. Comment parser un fichier.txt sous Access?
    Par takepaf dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 11h15
  4. Parser un fichier txt
    Par takepaf dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/05/2007, 11h29
  5. Parser un fichier TXT
    Par Blaireau dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2006, 20h28

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