Forum Programmation.shell CSH : Remplacement de mots dans un fichier à partir d'un fichier CSV de correspondance

Posté par  . Licence CC By‑SA.
Étiquettes :
0
28
avr.
2016

Bonjour,

J'ai un fichier XML évolutif au sein duquel j'aimerais remplacer des noms de ville à partir d'identifiant contenu dans une table de correspondance. pour chaque occurence du fichier.

exemple : table de correspondance

PARIS;75000
BORDEAUX;33000

J'étais parti sur un sed mais j'ai beau creuser je ne trouve pas.

Quelqu'un peut il m'aider SVP.
A votre disposition si vous avez besoin d'informations complémentaires.

J'ai déjà la boucle

while read line
do
var1=$( echo "$line" | sed -n -E 's/.Station="(.)".Value./\1/ p' )

if [ "$var1" ] ; then
    var2=$(echo "$var1" | tr a-z A-Z | cut -c 1-4)
    echo -e "`{mathjax} line" | sed -n -E "s/`{var1}/${var2}/ g" >> new_fichier.xml 
else 
    echo -e "$line" >> new_fichier.xml  
fi

done < fichier.xml

Merci beaucoup

  • # petit algo à traduire en langage de ton choix

    Posté par  . Évalué à 3.

    copier fichier.xml dans new_fichier.xml
    sauver IFS dans OLDIFS
    definir IFS à ;
    boucle pour chaque ligne du CSV
      stocker COL1
      stocker COL2
      rechercher COL1 et remplacer par COL2 dans new_fichier.xml
    fin boucle
    remettre IFS à son ancienne valeur (OLDIFS)
    • [^] # Re: petit algo à traduire en langage de ton choix

      Posté par  . Évalué à 2.

      si le fichier a beaucoup de ligne ça peut être optimisé

      while IFS=";" read ville cp
      do
         echo "s/$ville/$cp/g;"
      done >> fich.sed
      
      sed -f fich.sed -i fichier.xml

      à noter que je n'ai pas 'protégé' la lecture du csv, si tu as des ';' entre quotte ils seront comptés comme séparateur, de même si tu as des villes du genre MAC et MACON, le deuxième ne sera pas remplacé, il convient de modifier le sed (typiquement si c'est en attribut "s/\"$ville\"/\"$cp\"/g".

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # pourquoi se compliquer la vie avec une boucle shell et un sed tordu

    Posté par  . Évalué à 3.

    alors que awk est fait pour ça ?

    Dans la section BEGIN, tu crées ta table de correspondance et dans la boucle de traitement de ton flux, tu utilise la fonction gsub.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.