Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
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 02/04/2007, 11h47   #1
Invité régulier
 
Inscription : juillet 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 25
Points : 6
Points : 6
Par défaut Traitement de fichier

Bonjour,
Je fais appel à votre aide pour résoudre un problême assez classique (je pense), mais j'ai un peu de mal.
J'ai un fichier (XML) avec des balises indenté comme ci-dessous
...
Code :
1
2
3
4
5
6
7
8
9
10
<eA>
   <zoneA>xxx</zoneA>
   <zoneB>bklsf</zoneB>
   ...
   <zoneX>toto</zoneX>
   <zoneY>titi</zoneY>
</eA>
<eA>
   ...
</eA>
L'objectif est de transformer le fichier afin que pour objet eA, la valeur de zoneY soit remplacée par celle de la zoneX et valoriser la zoneX à 0.

J'ai réussi à faire la transformation dans le cas où d'un fichier comprenant une ligne unique par objet eA (toutes les zones concaténées) mais je galère si le fichier est indenté comme ceci.

Merci d'avance pour votre aide.
desbrandesq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 12h29   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
un petit script sed ira très bien pour ça....

man sed
voir expressions régulières pour la syntaxe de la selection des éléments à modifier.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 13h06   #3
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
Citation:
Envoyé par desbrandesq
Bonjour,
Je fais appel à votre aide pour résoudre un problême assez classique (je pense), mais j'ai un peu de mal.
J'ai un fichier (XML) avec des balises indenté comme ci-dessous
...
<eA>
<zoneA>xxx</zoneA>
<zoneB>bklsf</zoneB>
...
<zoneX>toto</zoneX>
<zoneY>titi</zoneY>
</eA>
<eA>
...
</eA>

L'objectif est de transformer le fichier afin que pour objet eA, la valeur de zoneY soit remplacée par celle de la zoneX et valoriser la zoneX à 0.

J'ai réussi à faire la transformation dans le cas où d'un fichier comprenant une ligne unique par objet eA (toutes les zones concaténées) mais je galère si le fichier est indenté comme ceci.

Merci d'avance pour votre aide.
c'est plus une question pour le forum XSLT…
en appliquant la transformation suivante à votre fichier original vous obtiendrez le résultat voulu :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
	<xsl:apply-templates />
</xsl:template>
 
<xsl:template match="eA/zoneX">
	<zoneX>0</zoneX>
</xsl:template>
 
<xsl:template match="eA/zoneY">
	<zoneY><xsl:value-of select="parent::eA/zoneX"/></zoneY>
</xsl:template>
 
<xsl:template match="*">
	<xsl:copy>
		<xsl:apply-templates select="*|@*|comment()|processing-instruction()|text()" />
	</xsl:copy>
</xsl:template>
 
</xsl:stylesheet>
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 17h07   #4
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par desbrandesq
Bonjour,
Je fais appel à votre aide pour résoudre un problême assez classique (je pense), mais j'ai un peu de mal.
J'ai un fichier (XML) avec des balises indenté comme ci-dessous
...
Code :
1
2
3
4
5
6
7
8
9
10
<eA>
   <zoneA>xxx</zoneA>
   <zoneB>bklsf</zoneB>
   ...
   <zoneX>toto</zoneX>
   <zoneY>titi</zoneY>
</eA>
<eA>
   ...
</eA>
L'objectif est de transformer le fichier afin que pour objet eA, la valeur de zoneY soit remplacée par celle de la zoneX et valoriser la zoneX à 0.

J'ai réussi à faire la transformation dans le cas où d'un fichier comprenant une ligne unique par objet eA (toutes les zones concaténées) mais je galère si le fichier est indenté comme ceci.

Merci d'avance pour votre aide.


La réponse que t'a fait JeitEmgie, c'est vraiment le top
Je te donne une solution moins pointue (mais plus facile à gérer si tu ne connaît pas XLST) avec "awk" comme suit :

Code :
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
 
#!/bin/sh
 
awk '
BEGIN {
FS="[<>]"
}
{
if ($2 == "eA") {	#-- DEBUT de l element <eA>
	TopEntite_eA=1
	print $0
	next
}
if ($2 == "/eA") {	#-- FIN de l element </eA>
	TopEntite_eA=0
	print $0
	next
}
if (TopEntite_eA == 1) {	#-- Parcours des enfants de l element </eA>
	if ($2 == "zoneX") {
		MemoZoneX=$3
		print $1"<"$2">0<"$4">"	#-- Ecr. de <zoneX>0</zoneX>
		next
	} else {
		if ($2 == "zoneY") {
			print $1"<"$2">"MemoZoneX"<"$4">"	#-- Ecr. de <zoneY> {valeur de zoneX} </zoneY>
			next
		}
	}
}
print $0
} ' flux.xml
Fichier en entrée :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<eA>
<zoneA>xxx</zoneA>
<zoneB>bklsf</zoneB>
<zoneX>toto</zoneX>
<zoneY>titi</zoneY>
</eA>
<eZ>
</zoneA>
</zoneB>
<zoneX>xxx</zoneX>
<zoneY>xxx</zoneY>
</eZ>
<eA>
<zoneA>xxx</zoneA>
<zoneB>bklsf</zoneB>
<zoneX>tutu</zoneX>
<zoneY>tztz</zoneY>
</eA>
Fichier en sortie :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<eA>
<zoneA>xxx</zoneA>
<zoneB>bklsf</zoneB>
<zoneX>0</zoneX>
<zoneY>toto</zoneY>
</eA>
<eZ>
</zoneA>
</zoneB>
<zoneX>xxx</zoneX>
<zoneY>xxx</zoneY>
</eZ>
<eA>
<zoneA>xxx</zoneA>
<zoneB>bklsf</zoneB>
<zoneX>0</zoneX>
<zoneY>tutu</zoneY>
</eA>
BlaireauOne 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 05h59.


 
 
 
 
Partenaires

Hébergement Web