Précédent   Forum des professionnels en informatique > Systèmes > Linux
Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2011, 15h25   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Par défaut Découper un fichier xml à l'aide de ksh

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 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?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
Code :
1
2
3
4
5
6
7
8
9
 
<offres>
<catalogue>
<stations>
stations1
......."les autres balises"
</stations>
</catalogue>
</offres>
Fichier 2

Code :
1
2
3
4
5
6
7
8
<offres>
<catalogue>
<stations>
stations 2
......."les autres balises"
</stations>
</catalogue>
</offres>
Ainsi de suite.

Une idée ??

Merci d'avance
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/08/2011, 19h37   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

un élément de réponse : ici

c'est transposable à ton problème, quasiment tel quel vers KSH, pour en faire un script awk.

!!! Il faut adapter...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/08/2011, 12h03   #3
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Bonjour,

Merci de ta réponse. voilà ce que j'ai fait! "Je suis très débutant en ksh, alors patience..."

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
while read line
do if [[ $line == "<stations>" ]]
   then <s>((flag)) && unset text</s>
        flag=1
        text="$line"
   elif ((flag))
   then text+=$'\n'"$line"
        if [[ $line == "</stations>" ]]
        then unset flag
             echo "$text" >flux$((++n))
        fi
   fi
done <flux.xml
j'ai mis le script dans le même répertoire que mon fichier à découper "flux.xml"
quand j'exécute le script que j'ai nommé cut.ksh il me donne ce message d'erreur : ./cut.ksh: syntax error at line 3 : `(' unexpected

Merci d'avance.
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 12h20   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
c'est à cause des balises du forum <s> et </s>.
c'est pas du code.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h26   #5
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Merci. Mais ça ne marche tjs pas, il me met, ./cut.ksh[6]: flag: bad number.
Enfait le code que j'ai copier dans le message précédent c'est tout ce que j'ai mis dans mon script, Il n y a pas d'autres paramètres a rajouter avant la boucle ?
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h56   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
comment fais-tu s'exécuter le script ?
le shebang est-il correct ?
quelle version de ksh utilises-tu ?

avec ksh93, je n'ai pas d'erreurs, et le script s'exécute correctement.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h03   #7
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
le script je l'execute avec la commence ./cut.ksh;
le shebang, je ne sais pas ce que c'est;
Pour la version ksh, je ne sais pas comment faire pour la trouver.

Je me demande s'il n y a pas des trucs a rajouter dans le script avant la boucle comme la declaration des variables et un argument pour mettre le fichier xml à traiter en entrer.
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h28   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
je n'ai fais qu'ajouter un shebang pour ksh.

tape ceci dans la console :
Code :
ksh --version; echo "$SHELL"
que répond le terminal ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h06   #9
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
cette ligne de commande ne retourne absolument rien.

Quand je fais un which ksh ou encore echo $SHELL il me retourne le chemin /usr/bin/ksh c'est tout
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h39   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
donc, on sait maintenant que ton shell de connexion est bien ksh;

pour en connaître la version, il y a plusieurs possibilités :
la combinaison de touches : Ctrl-Alt-V
ou
echo "${.sh.version}"

ou encore lire le man (ce que tu aurais dû avoir déjà fait (la partie sur l'évaluation arithmétique) !)

flag est ici un nombre, mais ça pourrait être une variable texte, qui existe ou pas en fonction du moment d'exécution du script.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h44   #11
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Citation:
flag est ici un nombre, mais ça pourrait être une variable texte, qui existe ou pas en fonction du moment d'exécution du script.
J'ai rien compris là
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 18h06   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
$flag est un témoin, il est sur 1 quand on est dans l'intervalle recherché, et sur 0 quand on en sort.

la structure (( variable-numérique )) teste si $variable-numérique est différent de zéro. c'est semblable à [ -n "$variable" ], qui teste que variable n'est pas vide.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h36.


 
 
 
 
Partenaires

Hébergement Web