[Script awk ou ksh] Découper un fichier xml

Résolu
Ranmakun Messages postés 23 Statut Membre -  
 tof1976 -
Bonjour à tous :)

Voilà je cherche à découper un fichier xml et j'ai cru comprendre que le awk pourrait être une bonne solution. Seulement je suis déjà pas vraiment fort en ksh, je suis vraiment un niewbie total en awk, et je n'ai rien compris aux quelques exemples que j'ai trouvé sur le net, voilà donc pourquoi je viens vous demander de l'aide ^^"

Mon fichier xml se présente comme suis :

<données>
    <pleindebalisemaisosef1>
</données>
<données>
    <pleindebalisemaisosef2>
</données>
<données>
    <pleindebalisemaisosef3>
</données>
<données>
    <pleindebalisemaisosef4>
</données>
etc... (le nombre de <données> est variable)


Et je dois obtenir autant de fichier (qu'on pourra nommer fic_1, fic_2, fic_3, etc enfin vous voyez le truc) que de balise données, autrement dit fic_1 contiendra
<données>
<pleindebalisemaisosef1>
</données>


fic_2 contiendra

<données>
<pleindebalisemaisosef2>
</données>


etc, etc...

Voilà voilà, j'espère que vous saurez m'aidez, je vous en remercie d'avance :)
Configuration: Windows 2000
Firefox 2.0

16 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    voilà une approche simpliste qui fonctionne
    bien sûr qu'on peut faire ce que tu veux mais ça sera mieux d'avoir un fichier pour pouvoir le parser
    $ cat t.xml
    <xml>elem1</xml>BLABLA<xml>elem2</xml>TOTOTITI<xml>elem3</xml>
    <xml>elem4</xml>BLABLA
    <xml>elem5</xml>TOTOTITI<xml>elem6</xml>
    <xml>elem7</xml>BLABLA<xml>elem8</xml>
    TOTOTITI<xml>elem9</xml>
    <xml>elem10</xml>
    BLABLA
    <xml>elem11</xml>TOTOTITI<xml>elem12</xml>
    <xml>elem13</xml>
    BLABLA
    <xml>elem14</xml>
    
    $ perl -ne '$"="\n";@t=/(<xml>(?!<\/xml>).*?<\/xml>)/g; print "@t\n"' t.xml
    <xml>elem1</xml>
    <xml>elem2</xml>
    <xml>elem3</xml>
    <xml>elem4</xml>
    <xml>elem5</xml>
    <xml>elem6</xml>
    <xml>elem7</xml>
    <xml>elem8</xml>
    <xml>elem9</xml>
    <xml>elem10</xml>
    
    <xml>elem11</xml>
    <xml>elem12</xml>
    <xml>elem13</xml>
    
    <xml>elem14</xml>
    
    1
    1. tof1976
       
      Bonjour,

      une question par rapport à ce qui a été proposé :

      $ perl -ne '$"="\n";@t=/(<xml>(?!<\/xml>).*?<\/xml>)/g; print "@t\n"' t.xml
      <xml>elem1</xml>
      <xml>elem2</xml>
      <xml>elem3</xml>
      <xml>elem4</xml>
      <xml>elem5</xml>

      Est ce qu'il est possible de passer en paramètre la balise (ici xml , dans <xml> et </xml>) afin de pouvoir chercher dynamiquement n'importe quelle valeur ?

      Merci
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > tof1976
         
        Salut,

        c'est ça que tu veux?
        root@debian:~# cat aaa
        <xml>elem1</xml>BLABLA<xml>elem2</xml>TOTOTITI<xml>elem3</xml>
        <xml>elem4</xml>BLABLA
        <xml>elem5</xml>TOTOTITI<xml>elem6</xml>
        <xml>elem7</xml>BLABLA<xml>elem8</xml>
        TOTOTITI<xml>elem9</xml>
        <xml>elem10</xml>
        BLABLA
        <xml>elem11</xml>TOTOTITI<xml>elem12</xml>
        <xml>elem13</xml>
        BLABLA
        <xml>elem14</xml>
        
        root@debian:~# perl -ne '$"="\n";$x='xml';@t=/(<$x>(?!<\/$x>).*?<\/$x>)/g; print "@t\n"' aaa
        <xml>elem1</xml>
        <xml>elem2</xml>
        <xml>elem3</xml>
        <xml>elem4</xml>
        <xml>elem5</xml>
        <xml>elem6</xml>
        <xml>elem7</xml>
        <xml>elem8</xml>
        <xml>elem9</xml>
        <xml>elem10</xml>
        
        <xml>elem11</xml>
        <xml>elem12</xml>
        <xml>elem13</xml>
        
        <xml>elem14</xml>
        
        root@debian:~#
        et
        root@debian:~# cat bbb
        <balise>elem1</balise>BLABLA<balise>elem2</balise>TOTOTITI<balise>elem3</balise>
        <balise>elem4</balise>BLABLA
        <balise>elem5</balise>TOTOTITI<balise>elem6</balise>
        <balise>elem7</balise>BLABLA<balise>elem8</balise>
        TOTOTITI<balise>elem9</balise>
        <balise>elem10</balise>
        BLABLA
        <balise>elem11</balise>TOTOTITI<balise>elem12</balise>
        <balise>elem13</balise>
        BLABLA
        <balise>elem14</balise>
        
        root@debian:~# perl -ne '$"="\n";$x='balise';@t=/(<$x>(?!<\/$x>).*?<\/$x>)/g; print "@t\n"' bbb
        <balise>elem1</balise>
        <balise>elem2</balise>
        <balise>elem3</balise>
        <balise>elem4</balise>
        <balise>elem5</balise>
        <balise>elem6</balise>
        <balise>elem7</balise>
        <balise>elem8</balise>
        <balise>elem9</balise>
        <balise>elem10</balise>
        
        <balise>elem11</balise>
        <balise>elem12</balise>
        <balise>elem13</balise>
        
        <balise>elem14</balise>
        
        root@debian:~#
        
        --
        lami20j
        0
      2. tof1976 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        wow, super sympa la rapidité de la réponse :)

        c'est presque ça, en fait je voudrais passer la valeur de la balise non pas dans le script perl, mais à l'extérieur su script perl, en 2e argument à coté du fichier (aaa et bbb dans tes exemples) mais je ne sais pas si c'est possible....

        la raison de cela c'est que je veux pouvoir renseigner la balise par le contenu d'une variable venant du script KSH appelant ce bout en perl.
        (hors là le bout en perl étant entre simple quotes , toutes les résolutions de variables venant du ksh ne fonctionnent pas)

        redis moi si je ne suis pas clair...
        0
      3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > tof1976
         
        root@debian:~# cat aaa
        
        <xml>elem1</xml>BLABLA<xml>elem2</xml>TOTOTITI<xml>elem3</xml>
        
        <xml>elem4</xml>BLABLA
        
        <xml>elem5</xml>TOTOTITI<xml>elem6</xml>
        
        <xml>elem7</xml>BLABLA<xml>elem8</xml>
        
        TOTOTITI<xml>elem9</xml>
        
        <xml>elem10</xml>
        BLABLA
        <xml>elem11</xml>TOTOTITI<xml>elem12</xml>
        <xml>elem13</xml>
        BLABLA
        <xml>elem14</xml>
        root@debian:~# perl -ne '$"="\n";($x)=@ARGV;@t=/(<$x>(?!<\/$x>).*?<\/$x>)/g; print "@t\n"' aaa xml 2>/dev/null
        <xml>elem1</xml>
        <xml>elem2</xml>
        <xml>elem3</xml>
        <xml>elem4</xml>
        <xml>elem5</xml>
        <xml>elem6</xml>
        <xml>elem7</xml>
        <xml>elem8</xml>
        <xml>elem9</xml>
        <xml>elem10</xml>
         
        
        <xml>elem11</xml>
        <xml>elem12</xml>
        <xml>elem13</xml>
         
        
        <xml>elem14</xml>
        root@debian:~# cat bbb
        <balise>elem1</balise>BLABLA<balise>elem2</balise>TOTOTITI<balise>elem3</balise>
        <balise>elem4</balise>BLABLA
        <balise>elem5</balise>TOTOTITI<balise>elem6</balise>
        <balise>elem7</balise>BLABLA<balise>elem8</balise>
        TOTOTITI<balise>elem9</balise>
        <balise>elem10</balise>
        BLABLA
        <balise>elem11</balise>TOTOTITI<balise>elem12</balise>
        <balise>elem13</balise>
        BLABLA
        <balise>elem14</balise>
        root@debian:~# perl -ne '$"="\n";($x)=@ARGV;@t=/(<$x>(?!<\/$x>).*?<\/$x>)/g; print "@t\n"' bbb balise 2>/dev/null
        <balise>elem1</balise>
        <balise>elem2</balise>
        <balise>elem3</balise>
        <balise>elem4</balise>
        <balise>elem5</balise>
        <balise>elem6</balise>
        <balise>elem7</balise>
        <balise>elem8</balise>
        <balise>elem9</balise>
        <balise>elem10</balise>
         
        
        <balise>elem11</balise>
        <balise>elem12</balise>
        <balise>elem13</balise>
         
        
        <balise>elem14</balise>
        
        0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    (j'ai finir par obtenir ce que je voulait avec un script Perl uniquement)

    C'est un script Perl que je t'ai proposé, mais le plus important c'est que tu as obtenu ce que tu veux.

    A savoir que ce que je t'ai donné peut être écrit dans un script Perl, puisque c'est un script Perl :-)

    Et puisque tu parles de Perl, quand tu veux parser de XML pense à XML::PARSER et Cie

    Bonne continuation
    1
  3. Ranmakun Messages postés 23 Statut Membre
     
    UP, je ne trouves toujours pas de solution, heeeeelp T.T
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Je pourrais le faire avec perl, mais si tu regardes ce thread à compter de message 5, tu pourrais peut être arrivé avec sed

    extraction de plusieurs lignes avec shell#5

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Avec "awk" c'est le même principe qu'avec "sed", à savoir :
    awk '/<données>/,/<\/données>/ { print $0 }' fichier
    reste à trouver la boucle qui va bien pour traiter chaque itération et l'envoyer dans un fichierX++...

    ;-))
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    la commande csplit est faite pour cela:

    NAME
    csplit - split files based on context
    SYNOPSIS
    csplit [-ks][-f prefix][-n number] file arg1 ...argn
    DESCRIPTION
    The csplit utility shall read the file named by the file operand, write all or part of that file into other files as directed by the arg operands, and write the sizes of the files.

    EXAMPLES
    1.
    This example creates four files, cobol00 ... cobol03:
    csplit -f cobol file '/procedure division/' /par5./ /par16./
    After editing the split files, they can be recombined as follows:
    cat cobol0[0-3] > file
    Note that this example overwrites the original file.

    http://pwet.fr/man/linux/commandes/posix/csplit/
    0
  8. Ranmakun Messages postés 23 Statut Membre
     
    Ben merci de vos réponse je vais voir ce que si c'est jouable en perl mais vu que je ne connais pas ce langage j'ai des doutes :p
    -1
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      tu peux essayer la commande que t'a donné dubcek ou avec sed ou awk
      si jamais perl s'impose, pas de problème je t'aiderai :-))
      0
  9. Ranmakun Messages postés 23 Statut Membre
     
    Je suis en train d'essayer la commande csplit mais ça a pas l'air de marcher :x

    J'essaie avec un fichier test.xml qui contient

    </xml>zefhoizefozebf<xml></xml>sfnzoefnzeiof<xml></xml>nfoifgioero<xml>


    je lance la commande csplit -f hope test.xml "/<xml>/" et j'obtiens un fichier hope00 qui est complètement vide, et un fichier hope01 qui contient la même chose que test.xml, où est mon erreur ? :/
    0
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    perl -ne 'print if #<xml>#..#</xml>#' fichier

    très simplist
    pour savoir c'est bien aussi de savoir la structure de fichier
    0
  11. Ranmakun Messages postés 23 Statut Membre
     
    Erf ça marche pas...

    perl -ne 'print if #<xml>#..#</xml>#' test.xml
    syntax error at -e line 1, at EOF
    Execution of -e aborted due to compilation errors.


    Je vais essayer de faire un script perl qui lit le fichier ligne par ligne et qui ecrit dans des fichiers de sortie en fonction de ce qu'il trouve, mais je sais pas si je vais arriver à obtenir ce que je voulais dans mon 1er post :x
    0
  12. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    perl -ne 'print if #<xml># .. #</xml>#' fichier

    comme ça, il y a espace après le 1er # et avant le 2ème #
    0
  13. Ranmakun Messages postés 23 Statut Membre
     
    Toujours la même ^^"

     perl -ne 'print if #<xml># .. #</xml>#' test.xml
    syntax error at -e line 1, at EOF
    Execution of -e aborted due to compilation errors.


    0
  14. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Pour obtenir ce que tu as besoin, un script en Perl ou Python (:-)) faire mieux l'affaire.
    Je ne veux pas me lancer si je n'ai pas un fichier sur lequel je pourrais travailler :-))
    0
  15. Ranmakun Messages postés 23 Statut Membre
     
    Merci beaucoup de votre aide, je n'ai pas adopté une des solutions proposée ici en particulier mais vos contributions m'ont grandement aidé à m'aiguiller vers la méthode que j'ai utilisé pour y arriver (j'ai finir par obtenir ce que je voulait avec un script Perl uniquement) ^^
    0
  16. snake0 Messages postés 4 Statut Membre
     
    csplit -f fic_ file.xml '/<données>>/' '{*}'
    tu vas obtenir ce que tu veux
    en tous cas merci à dubcek pour la merveilleuse commande csplit
    0
  17. tof1976
     
    Impeccable ! c'est exactement ce que je voulais !
    Merci beaucoup !
    0