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 :

[Système] Transfert XML >> PHP (Fichier xml local)


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut [Système] Transfert XML >> PHP (Fichier xml local)
    Bonjour,

    Tout d'abord excusez moi si je me suis trompé de section j'ai eu du mal a identifier le lieu exacte ou poser ma question.

    Je débute en programmation, tout particulièrement en manipulation de fichier xml.

    Mon besoin est assez simple je pense et les aides que je trouve me laisse dans l'embarras et cible des utilisations trop complexe, bref je m y perd.

    Voila ce que je veux:
    Récuperer deux données dans un fichier xml pour ensuite les exploiter en php/mysql, l'exploitation ca je sais faire mais la récupération via parser me pose problème.

    Structure du fichier xml:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     <Song FileName="Atomic Cat - Viva la Revolution!.mp3" FileSize="3931890" TagDate="704012053">
      <Infos SongLength="10810368" Date="704012053" />
      <BPM Bpm="18899" Phase="1559" />
      <FAME IsScanned="1" Volume="6065" />
      <Automix MixType="3" TempoStart="77155" TempoEnd="9753443" CutStart="1984" CutEnd="10490592" FadeStart="16896" FadeEnd="10643968" />
     </Song>
    C'est le motif du fichier xml parfois il change légérement.
    Je veux faire uniquement une exploitation local pour mon petit projet.

    J'ai besoin seulement de récupérer:
    Atomic Cat - Viva la Revolution!.mp3
    18899

    Soit le titre du morceau (Filename) et son BPM (Bpm).
    Ces données doivent juste etre stocké dans deux variable tableaux mais indexé de facon a ce que a chaque numéro d index j'ai bien le bon BPM pour le bon titre.

    J'ai fais un cod edéja qui donne des résultats:
    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
     
    <?php
    set_time_limit(0);
     
    $file = "test.xml";
    $contenu = fread(fopen($file, "r"), filesize($file));
    preg_match_all("|<Song FileName=\"(.*)\" FileSize=\"(.*)\" TagDate=\"(.*)\">|U", $contenu, $titre);
    preg_match_all("|<BPM Bpm=\"(.*)\"|U", $contenu, $bpm);
    // <BPM Bpm=\  Phase=\"(.*)\" BeatPhase=\"(.*)\" />|U
    $nbrtrack=count($titre[1]);
    echo '<b>Nbr de titre analysé(s) :'.$nbrtrack.'<br/>';
     
    /* le \d signifie n'importe quelle décimale */
    /* le .* signifie n'importe quel caractère '.' présent de 0 à n fois '*' */
     
    for($j=0;$j<count($titre[1]);$j++){
              echo $titre[1][$j].'<br/>';
    		  echo $bpm[1][$j].'<br/>';
        }
     
    ?>
    Mais comme on peut le voir je récupére de facon distincte le titre et le BPM ce qui fait que dès que j'ai un titre dans le XML sans BPM je suis planté et ca décale tout.

    J'aimerai juste faire la récupération en un temps dans la fonction preg_match_all ou utiliser une autre méthode pour arriver a mes fin.

    J'utilise easyphp
    php version 4.3.10

    Merci pour votre aide éventuel !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Quelque chose comme ça ?
    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
    <?php
    set_time_limit(0);
     
    $file = "song.xml";
    $contenu = fread(fopen($file, "r"), filesize($file));
    $nbtitre = preg_match_all('|<Song FileName="(.*)" FileSize=".*" TagDate=".*">.*<BPM Bpm="(.*)"|sU', $contenu, $titre, PREG_SET_ORDER);
    echo '<b>Nbr de titre analysé(s) :'.$nbtitre.'<br/>';
     
    # Construction du tableau
    $association = array();
    if ($nbtitre > 0) {
        foreach ($titre as $t) {
            $association[$t[2]] = $t[1];
        }
    }
    print_r($association);
    ?>
    J'ai volontairement regroupé les deux expressions régulières pour fiabilité et praticité. (Dommage sous PHP 5 avec SimpleXML, ça aurait été un jeu d'enfant).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Merci pour cette réponse et c'est vrai que mon problème se trouvait dans la formulation d une expression régulière, je vais étudié cette solution et vous tenir au courant du résultat !
    Et je pense que le regroupement des deux expressions (ce que j'ai essayé hier en vain) est la solution a mon problème (tout au moins logiquement).

    Premier test: le résultat est propre, petit extrait:

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nbr de titre analysé(s) :1020
    Array ( [20835] => Joris Delacroix - My FL Is Crazy.mp3 [22814] => Metricks - Waterfoam.mp3 [20354] => Jeff Hil0 - Phat Hour (Main Mix).mp3 [20044] => Vallesca - Hi Energy.mp3 [20352] => Anthony De Maria - Veillance.mp3 [20377] => Sonikadivision - Speed Tribal Remix.mp3 [21752] => Davidaubrun - Egoisme du Conformisme.mp3 [20045] => Transynth - Detuned.mp3 [20811] => DJ Magamed - Unknow (Energy Original Tech House Version Mix).mp3 [19895] => Sunburnt Octopus - Lost And Found.mp3 [19314] => Figure - Circuit Override.mp3 [21339] => ArcanaCrux - Composite in Mirror.mp3 [19599] => Anthony De Maria - Phencyclidine.mp3 [19896] => Wikoo - Black Away.mp3 [21162] => Vera - Club Mix.mp3 [21170] => Loo Dove - First Night.mp3 [19315] => Muttonheads - Demon On Da Way (Can Blaster Rmx).mp3.mp3 [21000] => Malcom Charles - Dancin N Singin.mp3 [16409] => DJ Lucifer - Blow That Door (Original Mix).mp3

    Je dois encore me pencher sur ces résultats en particulier j'ai l impression qu'il s agit d une bijection alors que certains titres ont le même BPM donc certains doivent ne pas apparaitre, j'étudie ca plus en détail et je reviens pour une conclusion.

    Je confirme j'ai rajouté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $verif=count($association);
     echo '<br/><br/>'.$verif;
    Ce qui me donne:
    Nombre de titre analysé: 1020
    Nombre d élément dans $association: 306
    ...

    Tous les titres aux meme BPM sont apparement écrasé et seul le dernier reste.

    Voici un extrait significatif (avec les différents motifs qui peuvent apparaitre et plusieurs sons au meme BPM si quelqun veut m aider en testant).

    Code XML : 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
    67
    68
    69
     <Song FileName="Jeff Hil0 ft Cadatta - Tri.mp3" FileSize="7700480" TagDate="703112213">
      <Infos SongLength="14147712" />
      <BPM Bpm="20835" Phase="5954" />
      <FAME IsScanned="1" Volume="5464" />
      <Automix MixType="3" TempoStart="89294" TempoEnd="13423694" CutStart="89376" CutEnd="14069344" FadeStart="91136" FadeEnd="14091776" />
     </Song>
     <Song FileName="Metricks - Waterfoam.mp3" FileSize="5865472" TagDate="703112132">
      <Infos SongLength="12928896" />
      <BPM Bpm="20835" Phase="8436" />
      <FAME IsScanned="1" Volume="6799" />
      <Automix MixType="3" TempoStart="1377276" TempoEnd="11232924" CutStart="1376992" CutEnd="12100032" FadeStart="861184" FadeEnd="12333056" />
     </Song>
     <Song FileName="Machiavelique Underground ft U115  - Exclusive for u115 over blog com.mp3" FileSize="65801730">
      <Infos Date="704260340" />
     </Song>
     <Song FileName="Atomic Cat - Red Alert.mp3" FileSize="10059776" TagDate="703112032">
      <Infos SongLength="18481536" />
      <BPM Bpm="20354" Phase="2058" />
      <FAME IsScanned="1" Volume="9107" />
      <Automix MixType="3" TempoStart="2607370" TempoEnd="15308266" CutStart="541344" CutEnd="17549696" FadeStart="185856" FadeEnd="18240000" />
     </Song>
     <Song FileName="Danylo - Here Comes The Sound (Jazzy Mix).mp3" FileSize="5931008" TagDate="703111902">
      <Infos SongLength="10895616" />
      <BPM Bpm="20044" Phase="3512" BeatPhase="2" />
      <FAME IsScanned="1" Volume="3845" />
      <Automix MixType="1" CutStart="3360" CutEnd="9835264" FadeStart="16896" FadeEnd="10254336" />
     </Song>
     <Song FileName="Cadatta - Tri (Jeff Hil0 rmx).mp3" FileSize="7700480" TagDate="703111901">
      <Infos SongLength="14147712" />
      <BPM Bpm="20835" Phase="5954" />
      <FAME IsScanned="1" Volume="5464" />
      <Automix MixType="3" TempoStart="89294" TempoEnd="13423694" CutStart="89376" CutEnd="14069344" FadeStart="91136" FadeEnd="14091776" />
     </Song>
     <Song FileName="AdamZ ft Electric Boogie - The AdamZ Project.mp3" FileSize="3047424" TagDate="703111858">
      <Infos SongLength="8398080" />
      <BPM Bpm="20352" Phase="17664" BeatPhase="1" />
      <FAME IsScanned="1" Volume="7317" />
      <Automix MixType="1" CutStart="414464" CutEnd="8118240" FadeStart="22528" FadeEnd="8173568" />
     </Song>
     <Song FileName="Sonikadivision - Speed Tribal Remix.mp3" FileSize="5472256" TagDate="703111851">
      <Infos SongLength="15078528" Date="703212133" />
      <BPM Bpm="20377" Phase="18006" BeatPhase="1" />
      <FAME IsScanned="1" Volume="6554" />
      <Automix MixType="3" TempoStart="690447" TempoEnd="13079663" CutStart="690656" CutEnd="13711264" FadeStart="23040" FadeEnd="15037952" />
     </Song>
     <Song FileName="Davidaubrun - Egoisme du Conformisme.mp3" FileSize="10911768" TagDate="704141619">
      <Infos SongLength="20048256" Date="704141619" />
      <BPM Bpm="21752" BeatPhase="1" />
      <FAME IsScanned="1" Volume="2972" />
      <Automix CutStart="105248" FadeStart="16896" FadeEnd="20014080" />
     </Song>
     <Song FileName="Muttonheads - Demon On Da Way (Stephane V Rmx).mp3" FileSize="6586418" TagDate="703112043">
      <Infos SongLength="12098304" />
      <BPM Bpm="20045" Phase="1011" />
      <FAME IsScanned="1" Volume="6502" />
      <Automix MixType="1" TempoStart="1011" CutStart="992" CutEnd="11594208" FadeStart="16896" FadeEnd="11919360" />
     </Song>
     <Song FileName="DJ Magamed - Unknow (Energy Original Tech House Version Mix).mp3" FileSize="5439539" TagDate="704172013">
      <Infos SongLength="10973952" />
      <BPM Bpm="20811" Phase="1040" />
      <FAME IsScanned="1" Volume="7904" />
      <Automix MixType="3" TempoStart="1040" TempoEnd="8658416" CutStart="960" CutEnd="9303200" FadeStart="16896" FadeEnd="10925056" />
     </Song>
     <Song FileName="Carbo - Fly To Ibiza.mp3" FileSize="8061014" TagDate="703112033">
      <Infos SongLength="14804352" />
      <BPM Bpm="19895" Phase="1704" />
      <FAME IsScanned="1" Volume="3181" />
      <Automix MixType="3" TempoStart="1704" TempoEnd="13689464" CutStart="1824" CutEnd="14399744" FadeStart="16896" FadeEnd="14424576" />
     </Song>

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Je repose donc le problème avec le code précédent qui a mon avis via une petite adapation va convenir:

    Donc voici le code avec ma petit vérification en plus:

    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
    <?php
    set_time_limit(0);
     
    $file = "test1.xml";
    $contenu = fread(fopen($file, "r"), filesize($file));
    $nbtitre = preg_match_all('|<Song FileName="(.*)" FileSize=".*" TagDate=".*">.*<BPM Bpm="(.*)"|sU', $contenu, $titre, PREG_SET_ORDER);
    echo '<b>Nbr de titre analysé(s) :'.$nbtitre.'<br/>';
      # Construction du tableau 
      $association = array();
      if ($nbtitre > 0)
      {
      foreach ($titre as $t)
      {  $association[$t[2]] = $t[1]; } }
     print_r($association);
     $verif=count($association);
     echo '<br/><br/>'.$verif;
    ?>
    Voici la réponse obtenu avec le petit fichier xml mis au dessus qui a été fait de facon a mettre a l'épreuve le code sur toute les difficultés (même BPM, non présence parfois des sous balises, différence dans les balises):

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nbr de titre analysé(s) :11
    Array ( [20835] => Cadatta - Tri (Jeff Hil0 rmx).mp3 [20354] => Machiavelique Underground ft U115 - Exclusive for u115 over blog com.mp3 [20044] => Danylo - Here Comes The Sound (Jazzy Mix).mp3 [20352] => AdamZ ft Electric Boogie - The AdamZ Project.mp3 [20377] => Sonikadivision - Speed Tribal Remix.mp3 [21752] => Davidaubrun - Egoisme du Conformisme.mp3 [20045] => Muttonheads - Demon On Da Way (Stephane V Rmx).mp3 [20811] => DJ Magamed - Unknow (Energy Original Tech House Version Mix).mp3 [19895] => Carbo - Fly To Ibiza.mp3 )
    
    9

    On voit donc que:

    Pour les titres de meme BPM au nombre de trois:
    20835
    Jeff Hil0 ft Cadatta - Tri.mp3
    Metricks - Waterfoam.mp3
    Cadatta - Tri (Jeff Hil0 rmx)

    Nous avons dans le résultat:
    [20835] => Cadatta - Tri (Jeff Hil0 rmx).mp3 OK

    C'est à dire la dernière occurence du titre au meme BPM.
    Cela dit ce code a au moins le mérite de me dresser un liste de BPM avec un morc eau uniquement par BPM ;-) !

    Je pense toutefois que si l'effet unique avait été sur les titres et non les BPM ca aurait été génial ! et m'aurait pas virer des résultats au contraire ca m'aurait supprimer les doubles dans les titres (et non dans les BPM.)

    Encore un petit soucis poru la balise du XML:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <Song FileName="Machiavelique Underground ft U115  - Exclusive for u115 over blog com.mp3" FileSize="65801730">
      <Infos Date="704260340" />
     </Song>
    qui elle ne contient pas d info sur le BPM. cependant pour ce problème je pense qu'il faudrait rajouter un if peut etre mais ce problème m importe moins.


    Reste plus qu'a enlever cette bijection!!!!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Bon cool lol mon auto discution m'a permi de résoudre je pense le premier gros problème !
    Comme je le disais faire une bijection en partant du titre et non du BPM aurait été extra j'ai donc tout simplement changé le code ici:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $association[$t[1]] = $t[2].'</br>';
    >>Inversion du 1 et du 2 et rajout du passage a la ligne
    !

    Résultat:

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Nbr de titre analysé(s) :11
    Array ( [Jeff Hil0 ft Cadatta - Tri.mp3] => 20835
    [Metricks - Waterfoam.mp3] => 20835
    [Machiavelique Underground ft U115 - Exclusive for u115 over blog com.mp3] => 20354
    [Danylo - Here Comes The Sound (Jazzy Mix).mp3] => 20044
    [Cadatta - Tri (Jeff Hil0 rmx).mp3] => 20835
    [AdamZ ft Electric Boogie - The AdamZ Project.mp3] => 20352
    [Sonikadivision - Speed Tribal Remix.mp3] => 20377
    [Davidaubrun - Egoisme du Conformisme.mp3] => 21752
    [Muttonheads - Demon On Da Way (Stephane V Rmx).mp3] => 20045
    [DJ Magamed - Unknow (Energy Original Tech House Version Mix).mp3] => 20811
    [Carbo - Fly To Ibiza.mp3] => 19895
    )
    
    11

    Reste le second problème qui lui est plus corsé pour le titre qui n'a pas de balise BPM!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    OK donc pour relancer la question et parfaire le code définitivement voici clairement le problème restant qui se situe sur l'analyse de ce passage irrégulier du XML:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Song FileName="Machiavelique Underground ft U115  - Exclusive for u115 over blog com.mp3" FileSize="65801730">
      <Infos Date="704260340" />
     </Song>
     <Song FileName="Atomic Cat - Red Alert.mp3" FileSize="10059776" TagDate="703112032">
      <Infos SongLength="18481536" />
      <BPM Bpm="20354" Phase="2058" />
      <FAME IsScanned="1" Volume="9107" />
      <Automix MixType="3" TempoStart="2607370" TempoEnd="15308266" CutStart="541344" CutEnd="17549696" FadeStart="185856" FadeEnd="18240000" />
     </Song>

    Le code vient sur le premier titre (Machiavélique) et ne trouve pas la balise BPM et va la chercher sur le second.
    Conclusion:
    Le premier titre qui n'avait pas de BPM apparait avec le BPM du second qui lui au final n apparait pas.

    On obtient ce résultat donc:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
     [Machiavelique Underground ft U115 - Exclusive for u115 over blog com.mp3] => 20354

    ALors qu'il faudrait obtenir:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    Atomic Cat - Red Alert.mp3=> 20354

    *** Détection du nombre de titre passé a la trappe car ils n avaient pas d info BPM**
    Je rajoute un compteur de titre (info BPM ou pas) afin de mesurer l'ampleur du problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $nbtitre = preg_match_all('|<Song FileName="(.*)" FileSize=".*" TagDate=".*">.*<BPM Bpm="(.*)"|sU', $contenu, $titre, PREG_SET_ORDER);
    $compttitre = preg_match_all('|<Song FileName="(.*)"|sU', $contenu, $atitre, PREG_SET_ORDER);
    echo '<b>Nbr de titre présent dans le XML (info BPM ou pas) : '.$compttitre.'</b><br/>';
    echo '<b>Nbr de titre analysé(s) :'.$nbtitre.'<br/>';
    Ce qui sur un gros fichier me donne un total de 1030 titres dont 10 sans info BPM.
    Reste a savoir si c'est possible de ne pas prendre en compte ces 10 titres automatiquement !


    Deux optique pour résoudre ce problème et les deux me conviendrait (je compte faire un traitement local et si le code est pas parfait je suis pret a fire quelque manip supplémentaire a la main enfin pas trop!)
    Soit:
    >> Un code qui permette de supprimer au préalable dans le fichier XML les balise Song qui ne contienne pas d info BPM (donc de sous balise BPM).
    OU
    >> Une petite adaptation du code présenté ci dessus qui permette de ne pas faire l extraction lorsque le titre n a pas de BPM...
    Par exemple en excluant de la recherche les motif suivant !!!:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <Infos Date="704260340" />
     </Song>
    Comment rajouter cette exclusion? ou autre méthode?

    Help !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Merci julp pour m'avoir mis sur les bons rails, une petite réflexion m'a donner la réponse finale que je reviendrai poster !
    (cette solution lève le second problème!)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Et voila ca roule vérif faite sur mon fichier de 1200 titres et c'est bon !

    Voila la solution finale, j'ai donc rectifier dans un premier temps en inversant la solution proposé et finalement j'ai abandonné cette structure de table associative mais en gardant l idée d'une table a deux colone.
    Pour repéré les lignes du XML qui ne comporte pas l info sur le BPM j'ai utiliser un système de compteur double qui se décale si il repère un titre non renseigné (décale uniquement pour l info BPM).
    Ce décalage allié a l'exploitation des deux tables généré par les pre match me donnée finalement la bonne association au bon endroit.
    Restait au final le traitement de la dernière ligne car le test décalé vérifie la correspondance des titres au rang n+1, problème la aussi résolu en mettant une sorte de mémoire des derniers résultats sortie (voir lasttitre et lastlasttitre).

    Merci beaucoup et je pense que ce code est vraiment très efficace (de toute facon je le saurai car lol je comtpe en faire une grosse grosse exploitation).

    Voici mon code, toutes remarques meme minime susceptible de l optimiser meme un petit peu est la bienvenu vu l usage massif que je veux en faire:

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?php
    set_time_limit(0);
    $file = "test.xml";
    $contenu = fread(fopen($file, "r"), filesize($file));
    $nbtitre = preg_match_all('|<Song FileName="(.*)" FileSize=".*" TagDate=".*">.*<BPM Bpm="(.*)"|sU', $contenu, $titre, PREG_SET_ORDER);
    $compttitre = preg_match_all('|<Song FileName="(.*)"|sU', $contenu, $atitre, PREG_SET_ORDER);
    echo '<b>Nbr de titre présent dans le XML (info BPM ou pas) : '.$compttitre.'</b><br/>';
    echo '<b>Nbr de titre analysé(s) :'.$nbtitre.'<br/>';
     
     //Contruction du tableau avec détection des titres sans info BPM
    $association = array();
     $inc=0;
     $compteurtable=0;
     $titresansbpm=0;
    while ($inc<$compttitre-1)
    {
    	//On vérifie que le parseur n a pas sauter un titre à cause d un manque d info BPM
    	$incc=$inc+1;
    	$positionpointeur=$incc-$titresansbpm;
    	if ($titre[$positionpointeur][1]==$atitre[$incc][1])
    	{
    		echo "<br/>la condition ".$titre[$positionpointeur][1]."==".$atitre[$incc][1]." est respecté ";	
    		$t1=$atitre[$inc][1];
    		$t2=$titre[$compteurtable][2];
    		echo "<br/>Enregistrement du titre: ".$t1;
    		echo "<br/>Au BPM: ".$t2."<br/>";
    		echo "<br/><b>Compteur inc(lié au titre): </b>".$inc;
    		echo "<br/><b>Compteur titre sans BPM: </b>".$titresansbpm;
    		echo "<br/><b>Compteur table(lié au bpm): </b>".$compteurtable."<br/>";
     
    		$association[$compteurtable][0] = '<br/>'.$t1;
    		$association[$compteurtable][1] = $t2;
     
    		$compteurtable=$compteurtable+1;
    		$inc=$inc+1;
    		$lastlasttitre=$lasttitre;
    		$lasttitre=1;
    	}
    	else
    	{
    		$inc=$inc+1;
    		$titresansbpm=$titresansbpm+1;
    		echo '<br/>Titre sans BPM<br/>';
    		$lastlasttitre=$lasttitre;
    		$lasttitre=0;
    	}
    }
     
    //Traitement spécifique pour le dernier titre
    $lastitle=$compteurtable+$titresansbpm;
     
    		echo "<br/><b>Compteur inc(lié au titre): </b>".$inc;
    		echo "<br/><b>Compteur titre sans BPM: </b>".$titresansbpm;
    		echo "<br/><b>Compteur table(lié au bpm): </b>".$compteurtable."<br/>";
    		echo "<br/>$lastlasttitre";	
    		echo "<br/>$lasttitre";
     
    if ($lasttitre==1)
    {
    		$t1=$atitre[$inc][1];
    		$t2=$titre[$compteurtable][2];
    		$association[$compteurtable][0] = '<br/>'.$t1;
    		$association[$compteurtable][1] = $t2;
    }
    else
    {
    	if ($lastlasttitre==1)
    	{
    		$preinc=$inc-1;
    		$t1=$atitre[$preinc][1];
    		$t2=$titre[$compteurtable][2];
    		$association[$compteurtable][0] = '<br/>'.$t1;
    		$association[$compteurtable][1] = $t2;
    	}
     
    }
    echo '</br>';
    print_r($association);	
     
    ?>
    Merci pour votre aide !

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Sinon voilà ce que j'avais rapidement codé en utilisant DOM XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $dom = domxml_open_file('song.xml');
    $xpath = xpath_new_context($dom);
    $obj = $xpath->xpath_eval('//Song/BPM[@Bpm]');
    $associations = array();
    foreach ($obj->nodeset as $bpm) {
        $parent = $bpm->parent_node();
    	if ($parent->node_type() == XML_ELEMENT_NODE && $parent->node_name() == 'Song') {
    		$associations[$parent->get_attribute('FileName')] = $bpm->get_attribute('Bpm');
    	}
    }
     
    echo '<pre>';
    print_r($associations);
    echo '</pre>';
    Je voulais éviter l'usine à gaz (un peu fainéant) par contre si vous comptez l'utiliser j'espère qu'il ne sera pas incompatible avec votre version.

    Résultat obtenu à partir des informations données plus haut :
    Array
    (
    [Jeff Hil0 ft Cadatta - Tri.mp3] => 20835
    [Metricks - Waterfoam.mp3] => 20835
    [Atomic Cat - Red Alert.mp3] => 20354
    [Danylo - Here Comes The Sound (Jazzy Mix).mp3] => 20044
    [Cadatta - Tri (Jeff Hil0 rmx).mp3] => 20835
    [AdamZ ft Electric Boogie - The AdamZ Project.mp3] => 20352
    [Sonikadivision - Speed Tribal Remix.mp3] => 20377
    [Davidaubrun - Egoisme du Conformisme.mp3] => 21752
    [Muttonheads - Demon On Da Way (Stephane V Rmx).mp3] => 20045
    [DJ Magamed - Unknow (Energy Original Tech House Version Mix).mp3] => 20811
    [Carbo - Fly To Ibiza.mp3] => 19895
    )

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Merci pour la précision, mon usine a gaz lol obtient aussi ce résultat mais je comparerai les deux et leur vitesse (et fiabilité si d'autre problèmes apparaissent).

    En tout cas je vais pouvoir étudier ce code car moi je sais pas faire ce genre de chose

    Pour la petite histoire mon projet est de faire une base de BPM et ensuite de l'exploiter en AJAX ce qui sera la grosse difficulté, cependant j'ai déja réussi a faire marcher le livegrid de Rico donc j'ai bonne espoir d'avoir juste a l adapter a mon problème.
    En tout cas cela va etre interessant d optimiser tout ca vu la taille a venir de la base (>500 000 morceaux pour l objectif )

    Pour la structure de ma base mysql j'ai pensé séparer en deux table:
    Artiste (idartiste, artiste)
    et
    Titre (idtitre, idartiste, bpm)

    Dois pousser a l extreme pour optimiser a fond en rajoutant une base bpm?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Architecte
    Inscrit en
    Juin 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Je peux t'assurer U115 que la version utilisant DOM est beaucoup plus rapide et plus sécurisée dans le sens où c'est le parseur XML qui fait le boulot

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup Spawnrider de ta venue !
    Ok je retiens alors ce point.
    Cependant au vue de la suite de mon travail a priori je ne devrai pas avoir a parser de gros fichier xml d un coup (je vais en fait récupéré des fichiers xml au fur et a mesure), j'ai maintenant fais le formulaire dynamque qui me permet d'afficher les différents résultat afin de controler le bon nommage des morceaux et deux colonnes associés titre et auteur passé par un code de prénettoyage qui m'aide a remettre tout bien,
    je vérifie donc pour chaque ligne que ca me plait (normalement a moyen terme le code de nettoyage devrait etre assez efficace pour que la vérif visuel aille de plus en plus vite mais pour garder un controle qualité je ne peux pas l enlever).

    Tout est donc en place maintenant.
    Une fois tout cela fait il faudra que je bosse sur des modules qui me permette un controle de la base totale (genre pour détecter l'écriture du meme artiste sous deux noms proche par exemple D Guetta et David Guetta).

    Voila merci pour votre aide j'ai tout ce qui me faut pour bien bosser, une fois tout cela fait je reviendrai sans doute dans la section AJAX !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 45
    Points
    45
    Par défaut
    Après avoir commencer a récupéré et à traiter les 5000 premiers titres et vu le travail que cela représente j'aimerai bien récupéré aussi l'information sur la durée du titre, cela serai vraiment trop dommage de pas sauter dès le départ sur cette opportunité.

    Dans le cas ou je reste sur la méthode initiale puis je formulé un preg_match_all tel qu'il me récupére le champ SongLength pour le motif type N°1:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Song FileName="Cerrone - Give Me Love.mp3" FileSize="6750208" TagDate="705021732">
      <Infos SongLength="12448512" />
      <BPM Bpm="20752" Phase="15744" />
      <FAME IsScanned="1" Volume="6028" />
      <Automix MixType="3" TempoStart="15744" TempoEnd="11304832" CutStart="14528" CutEnd="11843232" FadeStart="29696" FadeEnd="12062208" />
     </Song>

    Mais aussi tel qu'il ne récupère rien sur ce motif N°2:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Song FileName="david_guetta_-_open_your_eyes_(acapella).mp3" FileSize="56749" 
    TagDate="705020853"><Infos SongLength="102528" />
      <BPM BeatPhase="-1" />
      <FAME IsScanned="1" Volume="6509" />
      <Automix FadeStart="16896" FadeEnd="86016" />
     </Song>



    et rien aussi sur ce motif N°3:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Song FileName="Kleptomik - Nightclub Desillusion.mp3" FileSize="6544292" 
    TagDate="705022054"><Infos Date="705022033" />
     </Song>

    Mon problème est que actuellement j'ai fais une récupération qui récupère sur les motifs 1 et 2 et que cela ne me va pas car je voudrai ensuite caler ma transcription dans la base sur celle du BPM donc récupéré la longueur du morceau que lorsque le BPM est récupéré, je rappelle la fonction de récupération du BPM:
    $nbtitre = preg_match_all('|<Song FileName="(.*)" FileSize=".*" TagDate=".*">.*<BPM Bpm="(.*)"|sU', $contenu, $titre, PREG_SET_ORDER)

    Y a t il une requete pour le preg_match ?

    Si vraiment ce n'est pas possible je vais devoir passer a php5, merci de me donner votre avis.
    Si je dois passer a php5 comment modifier la requette en dom pour récupéré cette longueur? (voir motif 1 pour la structure).

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/11/2012, 13h47
  2. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  3. Réponses: 3
    Dernier message: 06/08/2007, 03h44
  4. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 17h22
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49

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