Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1820 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  remplissage de plusieurs fichiers XML depuis un fichier XLS

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

remplissage de plusieurs fichiers XML depuis un fichier XLS

n°1947864
anticafard​s
Posté le 07-12-2009 à 12:38:39  profilanswer
 

Bonjour,
 
Je vous sollicite une nouvelle fois parce que j'ai une tache récurrente à faire  et j'ai mis 2 heures pour faire 20 fois cette tache.
Je cherche donc une solution scriptée.
Voilà:
J'ai approximativement 340 fichiers XML  à créer et  à alimenter avec des données contenues dans un fichier excel.
 
Mon  fichier excel comporte 4 colonnes qui sont  respectivement :
 
le Computer Name, le LogonName, le FullName, et une chaine de caractère qui est logonName_RDP.
 
 
Mon fichier XML (copié ci dessous) doit être rempli comme suit:
 
<configuration xmlns="http://xml.juniper.net/ive-sa/6.3R6.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<users>
 <user-roles>
  <user-role>
   <name>FullNAME</name>  
            <general>
                <overview>
     <options>
                        <vlan-source-ip>false</vlan-source-ip>
                        <session-options>false</session-options>
                        <ui-options>false</ui-options>
                    </options>
     <access-features>
                        <web>false</web>
                        <windows-files>false</windows-files>
                        <nfs-files>false</nfs-files>
                        <sam>false</sam>
                        <telnet-ssh>false</telnet-ssh>
                        <terminal-services>true</terminal-services>
                        <meeting>false</meeting>
                        <email>false</email>
                        <network-connect>false</network-connect>
                    </access-features>
    </overview>
   </general>
   <terminal-services>
    <sessions>
     <session>
      <name>FullNAME_RDP</name>  
      <description />  
      <parent>--none--</parent>  
      <auto-launch>true</auto-launch>  
      <wts>
       <username>&lt;USER&gt;</username>  
       <password-type>variable</password-type>  
       <variable-password>&lt;PASSWORD&gt;</variable-password>  
       <host>COMPUTER NAME</host>  
       <client-port>0</client-port>  
       <server-port>3389</server-port>  
       <screen-size>fullscreen</screen-size>  
       <color-depth>16-bit</color-depth>  
       <launch-seamless>false</launch-seamless>  
       <alias-name />  
       <application-path />  
       <path-dir />  
       <connect-drives>false</connect-drives>  
       <connect-printers>false</connect-printers>  
       <connect-comports>false</connect-comports>  
       <allow-clipboard>false</allow-clipboard>  
       <experience-options>
        <desktop-background>false</desktop-background>  
        <menu-window-animation>false</menu-window-animation>  
        <bitmap-caching>false</bitmap-caching>  
        <desktop-composition>false</desktop-composition>  
        <show-content-dragging>false</show-content-dragging>  
        <themes>false</themes>  
        <font-smoothing>false</font-smoothing>  
       </experience-options>
       <connect-smartcards>false</connect-smartcards>  
       <sound-options>disable</sound-options>  
      </wts>
     </session>
    </sessions>
   </terminal-services>
  </user-role>
 </user-roles>
 <user-realms>
  <realm>
   <name>basic</name>
   <role-mapping-rules>
                <rule>
                    <name>logonName</name>
                    <user-name>
                        <test>is</test>
                        <user-names>logonName</user-names>
                    </user-name>
                    <roles>FullNAME</roles>
                    <stop-rules-processing>false</stop-rules-processing>
                </rule>
   </role-mapping-rules>
  </realm>
 </user-realms>
</users>  
</configuration>
 
Pouvez vous m'aider ? Avez vous la solution miracle?
 
Merci  de votre aide
 
Lyes
 

mood
Publicité
Posté le 07-12-2009 à 12:38:39  profilanswer
 

n°1947865
Modération
Posté le 07-12-2009 à 12:40:58  answer
 

Merci d'éviter de créer 36 topics pour le même sujet.

n°1947882
anticafard​s
Posté le 07-12-2009 à 13:22:27  profilanswer
 

Modération a écrit :

Merci d'éviter de créer 36 topics pour le même sujet.


 
Désolé,
 
Je ne savais pas trop  dans  quelle  catégorie le mettre j'hésitais entre les 3.
 
C'est promis je  recommencerai plus
 
Lyes

n°1947883
pataluc
Posté le 07-12-2009 à 13:23:58  profilanswer
 

sed et awk sont tes amis. tu enregistres ton fichier input en csv, puis tu fais qqchose comme

Code :
  1. awk -F\; '{print "sed -e \"s/Computer Name/$1/\" -e \"s/LogonName/$2/\" -e \"s/FullName/$3/\" -e \"s/logonName_RDP/$4/\" input.csv > $1_$2_$3_$4.xml"}' > traitement.sh
  2.  
  3. . ./traitement.sh
 

Message cité 1 fois
Message édité par pataluc le 07-12-2009 à 13:24:13
n°1948298
anticafard​s
Posté le 08-12-2009 à 11:05:28  profilanswer
 

pataluc a écrit :

sed et awk sont tes amis. tu enregistres ton fichier input en csv, puis tu fais qqchose comme

Code :
  1. awk -F\; '{print "sed -e \"s/Computer Name/$1/\" -e \"s/LogonName/$2/\" -e \"s/FullName/$3/\" -e \"s/logonName_RDP/$4/\" input.csv > $1_$2_$3_$4.xml"}' > traitement.sh
  2.  
  3. . ./traitement.sh


 


 
Bonjour Pataluc,
 
Ta solution m'intéresse, cependant comment est-ce que je fait pour récupérer la structure de mon xml d'origine?
Parce qu'en  fait les xml généré sont destinés à être injecté dans une passerelle juniper.
Y'a t-il possibilité d'indiquer un autre fichier xml "modèle" en entrée afin qu'il reprenne (en sortie) la même strucure que le fichier xml modèle?
Je sais pas si c'est  très clair se que je dis mais j'ignore comment m'expliquer autrement.
 
Merci de ton aide et  de votre aide à tous
 
Lyes

n°1948306
pataluc
Posté le 08-12-2009 à 11:16:49  profilanswer
 

dsl j'ai rien compris.
 
ah je crois que j'ai compris, il y a une erreur dans ce que j'ai mis plus haut, ca ca devrait être mieux:

Code :
  1. awk -F\; '{print "sed -e \"s/Computer Name/$1/\" -e \"s/LogonName/$2/\" -e \"s/FullName/$3/\" -e \"s/logonName_RDP/$4/\" template.xml > $1_$2_$3_$4.xml"}' input.csv > traitement.sh

Message cité 1 fois
Message édité par pataluc le 08-12-2009 à 11:18:35
n°1948340
anticafard​s
Posté le 08-12-2009 à 13:16:30  profilanswer
 

pataluc a écrit :

dsl j'ai rien compris.
 
ah je crois que j'ai compris, il y a une erreur dans ce que j'ai mis plus haut, ca ca devrait être mieux:

Code :
  1. awk -F\; '{print "sed -e \"s/Computer Name/$1/\" -e \"s/LogonName/$2/\" -e \"s/FullName/$3/\" -e \"s/logonName_RDP/$4/\" template.xml > $1_$2_$3_$4.xml"}' input.csv > traitement.sh



 
Merci de ta réponse et de ta rapidité.
 
Néanmoins il  reste une petite chose obscure pour mes neuronnes.
 
Si j'ai bien  compris dans les balises de mon  template XML il faut que je mette le nom des champs (computer Nam, Logon...) à remplacer par mes variables ($1 $2 $3 ...)?
 
Faut-il que les séparateurs de mon csv soient des "\" ?
 
Et le awk  va me générer le script traitement.sh qui  va faire le boutlot?
 
Si  c'est  ça  ta solution  est  géniale !!!
 
 
Merci pour ton aide.
 
Lyes

Message cité 1 fois
Message édité par anticafards le 08-12-2009 à 13:41:33
n°1948375
pataluc
Posté le 08-12-2009 à 14:17:35  profilanswer
 

anticafards a écrit :

Si j'ai bien  compris dans les balises de mon  template XML il faut que je mette le nom des champs (computer Nam, Logon...) à remplacer par mes variables ($1 $2 $3 ...)?


 
Exactement. dans ce que j'ai mis, le sed va chercher dans le template "Computer Name", ou "LogonName" et le remplacer par $1 ou $2.
 

anticafards a écrit :

Faut-il que les séparateurs de mon csv soient des "\" ?


en l'occurrence il faut que ce soit des points virgules. mais tu peux le changer en modifiant le paramètre -F du awk.
 

anticafards a écrit :

Et le awk  va me générer le script traitement.sh qui  va faire le boutlot?

normalement, oui.

n°1948415
anticafard​s
Posté le 08-12-2009 à 14:55:05  profilanswer
 

pataluc a écrit :


 
Exactement. dans ce que j'ai mis, le sed va chercher dans le template "Computer Name", ou "LogonName" et le remplacer par $1 ou $2.
 


 

pataluc a écrit :


en l'occurrence il faut que ce soit des points virgules. mais tu peux le changer en modifiant le paramètre -F du awk.
 


 

pataluc a écrit :

normalement, oui.


 
Bon je viens  d'essayer mais chez moi ça marche pas.
 
J'utilise Windows et les GNU/UnxUtils for windows.
 
J'ai tappé la commande suivante dans une console cmd sous windows XP depuis le répertoire où se trouve mes 2 fichiers le input.csv et  le template.xml:
 
gawk -F\; '{print "sed -e \"s/FullName/$1/\" -e \"s/Login_RDP/$2/\" -e \"s/computer/$3/\" -e \"s/logon/$4/\" -e \"s/logon2/$5/\"  template.xml > $2_.xml"}' input.csv > traitement.cmd  
 
 
et voici ce que ça me renvoit:
 
D:\debug>gawk -F\; '{print "sed -e \"s/FullName/$1/\" -e \"s/Login_RDP/$2/\" -e
\"s/computer/$3/\" -e \"s/logon/$4/\" -e \"s/logon2/$5/\"  template.xml > $2_.xm
l"}' input.csv  1>traitement.cmd
gawk: warning: escape sequence `\;' treated as plain `;'
gawk: cmd. line:1: '{print
gawk: cmd. line:1: ^ invalid char ''' in expression
 
 
Je sais pas si j'ai mal compris qqchose?
 
Encore merci pour ton aide
Lyes
 

n°1948477
pataluc
Posté le 08-12-2009 à 16:37:02  profilanswer
 

avec le gawk d'unxutils, tu ne peux pas utiliser les quotes simple, il faut mettre des doubles. du coup n'oublie pas d'échapper avec \" celle qui sont à l'intérieur, et d'échapper double celle qui l'étaient déja (avec \\\" ).

 

attention ensuite le > n'a pas l'air de passer, je te suggère de le remplacer par "___" et de le remplacer ensuite par > dans notepad ou autre.

 

ca devrait donner qqchose du genre:

Code :
  1. gawk -F ";" "{print \"sed -e \\\"s/FullName/$1/\\\"  ... template.xml __ $2_.xml\"}" input.csv

(j'ai corrigé aussi le -F, il faut mettre -F ";" et pas -F\; )

Message cité 1 fois
Message édité par pataluc le 08-12-2009 à 16:38:50
mood
Publicité
Posté le 08-12-2009 à 16:37:02  profilanswer
 

n°1948528
anticafard​s
Posté le 08-12-2009 à 18:40:33  profilanswer
 

pataluc a écrit :

avec le gawk d'unxutils, tu ne peux pas utiliser les quotes simple, il faut mettre des doubles. du coup n'oublie pas d'échapper avec \" celle qui sont à l'intérieur, et d'échapper double celle qui l'étaient déja (avec \\\" ).
 
attention ensuite le > n'a pas l'air de passer, je te suggère de le remplacer par "___" et de le remplacer ensuite par > dans notepad ou autre.
 
ca devrait donner qqchose du genre:

Code :
  1. gawk -F ";" "{print \"sed -e \\\"s/FullName/$1/\\\"  ... template.xml __ $2_.xml\"}" input.csv

(j'ai corrigé aussi le -F, il faut mettre -F ";" et pas -F\; )


 
 
Merci, shokran, sahit, thank you so much, gracias  ! it works...
 
ça marche nickel !
 
 
Lyes


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  remplissage de plusieurs fichiers XML depuis un fichier XLS

 

Sujets relatifs
Formulaire (upload de fichier)Où stocker les meta-informations d'un ensemble de fichiers ?
Copier fichier - pb avec les liaisonsExécution de plusieurs .sql dans un .bat
[Résolu] Exécution de plusieurs SQL dans un .batNom du fichier commençant par zéro
Aide pour parcourir un XMLlire une suite de nombre séparé par une tabulation dans un fichier
Accès multiples à un fichier en C++ sous windowEmpecher l'erreur lors du chargement du XML
Plus de sujets relatifs à : remplissage de plusieurs fichiers XML depuis un fichier XLS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR