IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Traitement de fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 : 5 196
    Par défaut
    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.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  4. #4
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

Discussions similaires

  1. [Traitement de fichiers] substitutions
    Par david_m dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2006, 09h27
  2. traitement de fichier
    Par loic_86 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/11/2005, 17h56
  3. Réponses: 1
    Dernier message: 24/07/2005, 22h25
  4. TRaitement de fichier avec PERL
    Par Dr_GonZO dans le forum Langage
    Réponses: 4
    Dernier message: 22/07/2005, 12h38
  5. traitement de fichier XML dans une Tache planifiée
    Par marivi dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 21/06/2005, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo