[Shell] Création de plusieurs fichiers XML

Résolu
Zent -  
 Zent -
Salut tlm!!

Voilà, j'ai besoin de réaliser un script shell, et je n'arrive malheuresement pas à appliquer mes peu de connaissances pour réaliser ce que je veux.

A la base, j'ai un fichier à plat du type:
data1 value1
data2 value2
data3 value3

Chaque ligne est séparée par une tabulation.

Je voudrais pouvoir créer un fichier XML pour chaque ligne, avec pour nom le numéro de la ligne.
Par exemple on aurait test_1.xml :
<data>data1</data><value>value1</value>
test_2.xml :
<data>data2</data><value>value2</value>
etc etc

J'ai voulu faire une boucle couplée à un awk:

numero=1
while read line ;do
while $numero<10 ; do
awk -F " " '{ print "<data>"$1"</data><value>"$2"</value>" }' entree> test_$numero.xml
numero=$((1+$numero))
done
done < entree

Mais effectivement, ce script ne peut pas marcher... Il crée des milliers de fichiers avec à l'intérieur :
<data>data1</data><value>value1</value>
<data>data2</data><value>value2</value>
<data>data3</data><value>value3</value>

Quelqu'un peut m'aider à remettre tout ça dans l'ordre?? Je me rends bien compte que je ne peux pas coupler le awk et le while, mais je vois pas bien comment...

Merci !!!

23 réponses

  • 1
  • 2
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    perl -pi.orig -e 's/^(\w+)\s+(\w+)/<data>$1<\/data><value>$2<\/value$>/' fichier_donnee
    --
    lami20j
    0
  2. Zent
     
    Merci pour ta réponse lami20j, mais j'ai un petit souci...

    Quand un des champs contient une date DD/MM/YYYY, j'obtiens :
    <data>1</data><value>01</value215/01/2007
    le champ de date contenait 01/01/2007

    Je ne connais pas du tout perl, donc je n'arrive pas à créer un fichier par ligne lue...

    Merci encore!!
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    alors affiche quelque lignes de ton fichier
    en fait il n'a que 2 champs par ligne?
    et je te donnerai la bonne commande
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    essaie avec ça
    perl -pi.orig -e 's/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value$>/'  fichier
    --
    lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Zent
     
    Merci pour ton aide en tout cas.

    Effectivement, mon fichier sera amené à avoir plus de colonnes, mais j'imagine que le procédé reste le même.

    En entrée :
    1 01/01/2007
    2 02/01/2007
    3 03/01/2007
    4 04/01/2007

    Et la dernière commande me donne en sortie :
    <data>1</data><value>01/01/2007</value215
    <data>2</data><value>02/01/2007</value215
    <data>3</data><value>03/01/2007</value215
    <data>4</data><value>04/01/2007</value215

    Merci encore
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    tu pouvais me corriger quand même :-))
    j'ai oublié un dollar $ à la fin
    perl -pi.orig -e 's/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value>/'  fichier
    --
    lami20j
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut,

      Tu l'as pas oublié, il est en trop ;-DDD

      Au cas ou, la même solution avec "sed" :
      sed -ri.bak 's|(.*) (.*)|<data>\1</data><value>\2</value>|'
      ;-))
      0
  8. Zent
     
    Ah oui tiens un ptit $ qui traine ^^

    C'est super sympa de m'aider les gars.

    Je vais encore chercher comment faire pour créer plusieurs fichiers

    ++
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    ce n'est pas difficile de créer plusieurs fichiers
    il faut seulement dire ce que tu veux faire exactement

    à savoir que les commandes que tu as à ta disposition peuvent être exécuter sur plusieurs fichiers
    0
  10. Zent
     
    En fait en entrée j'ai un seul fichier :
    1 01/01/2007
    2 02/01/2007
    3 03/01/2007
    4 04/01/2007

    Et je voudrais en sortie :
    le fichier test1.xml:
    <data>1</data><value>01/01/2007</value>
    le fichier test2.xml:
    <data>2</data><value>02/01/2007</value>
    etc etc jusqu'à la fin du fichier d'entrée.

    Merci
    0
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je n'ai pas testé

    perl -ne 'open F ">>test${.}.xml";s/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value>/;print F;close F;' fichier


    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Testé et approuvé :
    while read line; do echo $line | sed -r 's|(.*) (.*)|<data>\1</data><value>\2</value>|' > test${line% *}.xml; done < fichier_entrée
    ;-))
    0
  13. Zent
     
    C'est bizarre moi j'ai une erreur :

    A file or directory in the path name does not exist.
    sh[2]: test1^I01/01/2007.xml: 0403-005 Cannot create the specified file.
    A file or directory in the path name does not exist.
    sh[2]: test2^I02/01/2007.xml: 0403-005 Cannot create the specified file.
    A file or directory in the path name does not exist.
    sh[2]: test3^I03/01/2007.xml: 0403-005 Cannot create the specified file.

    :/
    0
  14. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    jp@MDK:~/tmpfs ssh$ ls
    
    plop
    
    jp@MDK:~/tmpfs ssh$ while read line; do echo $line |sed -r 's|(.*) (.*)|<data>\1</data><value>\2</value>|' > test${line% *}.xml; done < plop
    
    jp@MDK:~/tmpfs ssh$ ls
    
    plop  test1.xml  test2.xml  test3.xml  test4.xml 
    
    jp@MDK:~/tmpfs ssh$ cat test*
    
    <data>1</data><value>01/01/2007</value>
    <data>2</data><value>02/01/2007</value>
    <data>3</data><value>03/01/2007</value>
    <data>4</data><value>04/01/2007</value>
    
    jp@MDK:~/tmpfs ssh$
    ;-))
    0
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    ma version tu l'as testé? :-))
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
       perl -ne 'open F ">>test${.}.xml";s/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value>/;print F;close F;' plop
      Missing comma after first argument to open function at -e line 1, near "">>test${.}.xml";"
      Execution of -e aborted due to compilation errors.
      ;-((

      Corrige et je re-testerai ;-))
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        tu pouvais me corriger
        mais bon, avec l'anglais t'es comme je suis avec le français :-))
        comma
        perl -ne 'open F, ">>test${.}.xml";s/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value>/;print F;close F;' plop

        0
      2. Zent > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Wahou super les mecs ca marche (la version de lami20j)!!!

        Merci à tous les deux, ta version doit aussi marcher jicipy mais je n'y suis pas arrivé.

        En tout cas, merci encore les gars, vous m'avez enlevé une épine du pied!!!!!!
        0
  16. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    jp@MDK:~/tmpfs ssh$ perl -ne 'open F, ">>test${.}.xml";s/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value>/;print F;close F;' plop
    
    jp@MDK:~/tmpfs ssh$ ls
    
    plop  test1.xml  test2.xml  test3.xml  test4.xml  test5.xml
    
    jp@MDK:~/tmpfs ssh$ cat test*
    
    <data>1</data><value>01/01/2007</value>
    <data>2</data><value>02/01/2007</value>
    <data>3</data><value>03/01/2007</value>
    <data>4</data><value>04/01/2007</value>
    
    jp@MDK:~/tmpfs ssh$
    ;-))

    PS. T'as un accès SSH depuis ton taf ? Si tu veux tu peux te logguer chez moi, je te passes l'@ IP et tes identifiants...

    PS2. Je suis nul en anglais, mais bon y'a quand même des trucs que je sais... quand je suis pas dans le coma ;-DD
    0
  17. Zent
     
    Désolé, je reviens...

    perl -ne 'open F, ">>test${.}.xml";s/^(\S+)\s+(\S+)/<data>$1<\/data><value>$2<\/value><date>$3<\/date>/;print F;close F;' plop

    En résultat j'ai :
    <data>01/01/2007</data><value>29/06/2007</value><date></date> 01/12/2009

    Pourquoi ça ne marche que jusqu'à 2?? T_T

    Merci d'avance
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      ben oui, c'est normal
      tu as ajouté dans la commande un $3 mais on n'a pas capturé le 3ème champ puisqu'on n'avait pas
      donc decide toi et dit exactement ce que tu veux
      tu peux toujours adapté une commande mais il faut savoir à quoi
      si demain t'auras envie de changer quelque chose tu vas tester toujours la même commande ou tu vas la modifié sans savoir ce que tu fait, et ça sera normal que ça ne marchera pas

      le mieux c'est de donner le nombre des champs ainsi que les balises

      0
    2. Zent
       
      Bah déjà je vais avoir toute l'entête XML, mais ca j'arrive à la mettre.

      En tout je risque d'avoir jusqu'à 17 champs.
      Peu m'importe le nom que prend la balise, j'aimerais bien arriver à comprendre ta commande déjà ^^

      Merci encore de m'aider!! :)
      0
  18. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    avec 17 champs la commande devienne trop longue et plus facile à la maintenir
    si jamais t'oublie une seule virgule (comma je l'ai fait moi :-)) tu vas te casser la tête pour trouver l'erreur
    un script sera plus adapté à ton cas

    donc affiche ici les balises
    et comment on doit les inserer dans tes futurs fichiers xml

    je vais t'expliquer aussi la commande ou plutôt le script :-))
    à toi
    0
  19. Zent
     
    Hello,

    Voici un exemple concret de fichier XML que je voudrais en sortie :
    <?xml version="1.0" encoding="UTF-8"?>
    <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="aaa.xsd">
    55

    <id/>
    <temp_id/>
    <id2>$1</id2>
    <ref>$2</ref>
    <ref2>$3</ref2>
    <name>$4</name>
    <code1>$5</code1>
    <scode1/>
    <code2>$6</code2>
    <code3>$7</code3>
    <code4>$8</code4>
    <inp_user_id/>
    <date1>$9</date1>
    <id3/>
    <date2/>
    <date3>$10</date3>
    <date4/>
    <date5/>
    <date6>$11</date6>
    <date7/>
    <date8>$12</date8>
    <amt/>
    <amt_dt/>
    <code5>$13</code5>
    <amt2>$14</amt2>
    <code6>$15</code6>
    <amt3>$16</amt3>
    <code7>$17</code7>
    </record>

    En entrée on peut avoir :
    01/01/2007 29/06/2007 01/12/2009 AAA Name1 address1 name2 address2 EUR 10 BBB CCC DDD type1 text1 instruc1 instruc2

    Et plusieurs lignes de ce type dans le fichier d'entrée.

    A partir de chacune de ces lignes, créer un fichier XML avec un nom différent (par exemple avec le numéro de la ligne, peu importe) en remplissant le modèle plus haut.

    Merci encore de prendre du temps pour m'aider :)

    @++
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Oups, je t'ai oublié :-))

      je vais regardé ce soir
      0
      1. Zent > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Oups, j'avais pas vu ton commentaire ^^

        Merci pour ton aide lami20j :)
        0
  20. Zent
     
    Yop,

    Désolé je fais un ptit up, je galère encore sur ce problème....

    Merci d'avance
    0
  21. Zent
     
    En fait c'est bon, j'ai fait un truc tout moche avec ta commande en catchant les autres variables.
    Du coup, ca marche, c'est vrai que c'est pas très maintenable mais je pense que ca suffira pour l'instant.

    Merci encore énormément lami20j (et jipicy aussi pour avoir passé du temps ^^)
    0
  • 1
  • 2