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
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
A voir également:
- Découper un fichier xml à l'aide de ksh
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment découper un pdf - Guide
- Ouvrir un fichier .bin - Guide
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
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 à :
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
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
22 août 2011 à 13:46
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.
23 août 2011 à 03:41
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