Découper un fichier xml à l'aide de ksh

Fermé
azahiri - 19 août 2011 à 12:11
mamiemando Messages postés 33378 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 novembre 2024 - 23 août 2011 à 03:41
Bonjour,

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

J'ai un fichier xml assez lourd que j'aimerai découper, c'est facile en utilisant un bout de code awk, seulement le critère sur lequel j'aimerai le découpé me complique la tâche, je m'explique, voici la structure de mon xml :

<?xml version="1.0" encoding="utf-8" ?>
<offres>
  <catalogue>
      <stations>
          <station>
             <residences>
                  <residence>
                      <produits>
                          <produit>
                              <departs>
                                  <depart></depart>
                              </departs>
                          </produit>
                       </produits>
                   </residence>
              </residences>
           </station>
        </stations>
    </catalogue>
</offres>


Mon problème c'est que j'aimerai créer un fichier par station, <stations> comme suit :

Fichier 1 :

<offres>
<catalogue>
<stations>
stations1
......."les autres balises"
</stations>
</catalogue>
</offres>


Fichier 2 :

<offres>
<catalogue>
<stations>
stations 2
......."les autres balises"
</stations>
</catalogue>
</offres>


Ainsi de suite.

Une idée ??

Merci d'avance.
A voir également:

1 réponse

mamiemando Messages postés 33378 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 novembre 2024 7 802
Modifié par mamiemando le 21/08/2011 à 22:39
Ta question est un peu ambigüe à cause de <station> et <stations> et du fait que dans ta décomposition chaque station est notée "stations".

De prime abord et même si c'est faisable en awk, je pense qu'utiliser un parseur xml tels qu'il en existe dans plein de langages (perl, python, java, c...) serait plus adapté, d'autant plus qu'il sera correctement indenté

Si tu restes sur du awk, le principe est simple : dès que tu rencontres une balise délimitante (<station> ?) il faut basculer un "booléen" à vrai qui indique que tu es en train d'extraire un station. Dès que tu rencontres la balises fermantes, tu le bascules à faux.

Dès que tu lis une ligne et selon l'état du booléen, tu sais ce que tu es en train de faire. Ainsi la structure du programme ressemblerait à :

#!/usr/bin/awk   

BEGIN {   
  extraitFichier = 0;   
  enteteEcrite = 0;   
  idFichier = 0;   
}   

/<station>/{   
  filename = ("toto", idFichier);   
  print "</catalogue>\n</offre>\n"  >> filename;   
  idFichier = idFichier + 1;   
  extraitFichier = 1;   
}   

/<\/station>/{   
  extraitFichier = 0;   
  enteteEcrite = 0;   
} 

{   
  filename = ("toto", idFichier);   
  if(enteteEcrite == 0) {   
    print "<offre>\n<catalogue>\n" >> filename;   
  }   
  if(litFichier) {   
    print $0 > filename;   
  }   
}   


Je n'ai pas testé, c'est juste un jet de départ, après il y a sans doute deux trois choses à arranger mais je pense que tu devrais trouver...

Bonne chance
0
Bonjour,

Merci de ton aide. Je tiens à te signaler que je n'ai jamais développé avec awk et que je suis débutant en ksh, alors patience si je pose des questions débiles.

- Je ne vois aucune boucle dans la code, on va y arriver sans ?

- Comment pointer sur le fichier à exécuter ?

Merci d'anvance.
0
mamiemando Messages postés 33378 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 novembre 2024 7 802
23 août 2011 à 03:41
Pour la première question, je t'invite à lire :

man awk


Tu peux également lire ce qui est raconté sur wikipedia :
https://fr.wikipedia.org/wiki/Awk

Si tu ne sais pas ce qu'est une expression rationnelle (ou expression régulière), lis par exemple l'article sur wikipedia. En plus des symboles usuels, en awk, les expressions rationnelles sont encadrées par des barres obliques.
https://fr.wikipedia.org/wiki/Expression_rationnelle#Notation_usuelle_de_grep.2C_ed.2C_sed_et_vi

En gros chaque bloc du programme awk est lu à chaque fois qu'une ligne du programme est lu, excepté le bloc BEGIN.

Dans ce programme, en fonction de la ligne lue, on rentre dans le premier bloc rencontré qui concorde avec l'expression rationnelle qui le précède (respectivement <station>, </station>, et les autres lignes).

Bonne chance
0