Créer un fichier xml à partir d'un csv

Tofdu31 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je cherche à effectuer un batch qui me permettrait de récupérer les informations d'un fichier csv et de me le convertir en fichier XML avec des instructions complémentaires.

Commençons par le fichier csv. Le nombre de ligne peuvent différer:

android.permission.INTERNET
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.ACCESS_NETWORK_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.ACCESS_WIFI_STATE
android.permission.READ_PHONE_STATE


Et voici le fichier final au format XML :

[{"packageName":"com.androidappli.toto","permissions":[{"name":"android.permission.INTERNET","value":"1"},
{"name":"android.permission.WRITE_EXTERNAL_STORAGE","value":"1"},
{"name":"android.permission.ACCESS_NETWORK_STATE","value":"1"},
{"name":"android.permission.BLUETOOTH","value":"1"},
{"name":"android.permission.BLUETOOTH_ADMIN","value":"1"},
{"name":"android.permission.ACCESS_WIFI_STATE","value":"1"},
{"name":"android.permission.READ_PHONE_STATE","value":"1"}]}]


Dans une variable, j'ai placé le nom de mon application ID qui est
com.androidappli.toto
.

Du coup, la premiere ligne xml, on doit ajouter l'information suivante comme on peut voir ci-dessus :
[{"packageName":"com.androidappli.toto","permissions":[


Et pour finir, à la dernière ligne, il faut rajouter : (on peut le voir sur l'exemple ci-dessus)
 ]}]


Quelqu'un aurait un petit moment pour m' aider ?

Pour la première ligne, j'avais pensé à mettre les infos dans une variable :
set applicationID=com.androidappli.toto
set ligne_first=[{"packageName":"%applicationID%","permissions":[


Merci et au plaisir de vous lire

Tof

7 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    On ne va pas réinventer la roue à chaque fois.
    La réponse t'as déjà été donnée par Flodelarab dans ce fil de discussion sur Developpez.

    0
  2. Tofdu31
     
    OK mais ça marche en aucun cas, du coup je réinvente pas la roue...

    J'ai trouvé ceci, on pourrait faire quelques choses non avec ça ?
    for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ça c'est un batch Windows. Aucun intérêt ici.
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      OK mais ça marche en aucun cas
      Ah bon ?

      Je reprends texto tout ce qu'a fait Flodelarab :

      Le contenu du fichier d'entrée :
      $ cat permissions.csv 
      android.permission.INTERNET
      android.permission.WRITE_EXTERNAL_STORAGE
      android.permission.ACCESS_NETWORK_STATE
      android.permission.BLUETOOTH
      android.permission.BLUETOOTH_ADMIN
      android.permission.ACCESS_WIFI_STATE
      android.permission.READ_PHONE_STATE


      La déclaration de la variable contenant le texte de la ligne à insérer :
      $ var=pouet

      $ echo "${var}"
      pouet


      La commande sed appliquée au fichier d'entrée et son résultat sur la sortie standard (l'écran) :
      $ sed -e '1iMa première ligne avec '"$var" -e 's@^@{"name":"@' -e '$!s@$@","value":"1"},@' -e '$s@$@","value":"1"}]}]@' permissions.csv 
      Ma première ligne avec pouet
      {"name":"android.permission.INTERNET","value":"1"},
      {"name":"android.permission.WRITE_EXTERNAL_STORAGE","value":"1"},
      {"name":"android.permission.ACCESS_NETWORK_STATE","value":"1"},
      {"name":"android.permission.BLUETOOTH","value":"1"},
      {"name":"android.permission.BLUETOOTH_ADMIN","value":"1"},
      {"name":"android.permission.ACCESS_WIFI_STATE","value":"1"},
      {"name":"android.permission.READ_PHONE_STATE","value":"1"}]}]


      Il est où le problème ?
      0
  3. Tofdu31
     
    Re,
    Je comprends, en fait suis aussi sous Windaube, du coup pas évident pour faire l'adaptation.
    Bon déja, j'ai effectué la vérif et la validation des points suivants :
    set var=pouet
    echo %var%

    ça c'est ok

    Ensuite j'ai validé aussi la partie :
    %sed% -e "1iMa première ligne avec "%var% permissions.csv

    Voici ce que j'ai à l'écran :
    Ma première ligne avec pouet
    android.permission.INTERNET
    android.permission.WRITE_EXTERNAL_STORAGE
    android.permission.ACCESS_NETWORK_STATE
    android.permission.BLUETOOTH
    android.permission.BLUETOOTH_ADMIN
    android.permission.ACCESS_WIFI_STATE
    android.permission.READ_PHONE_STATE


    Du coup là aussi on est bon.

    Par contre la suite là ça marche pas :
    %sed% -e "1iMa première ligne avec "%var% -e 's@^@{"name":"@' -e '$!s@$@","value":"1"},@' -e '$s@$@","value":"1"}]}]@' permissions.csv


    Déja, sous Windaube, je sais que les tildes doivent étre remplacé par les guillements :
    - e "s@^@{"name":"@' -e '$!s@$@","value":"1"},@" -e '$s@$@","value":"1"}]}]@"


    Du coup, on va découper pour faire déja un premier test. Toutefois, j'arrive pas a faire fonctionner juste une interprétation comme :
    -e "s@^@{"name":"@' -e '$!s@$@","value":"1"}"


    %sed% -e "1iMa première ligne avec "%var% -e "s@^@{"name":"@' -e '$!s@$@","value":"1"}" permissions.csv


    J'ai l'erreur :
    sed.exe: -e expression n°2, caractère 11: option inconnue pour `s'
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      en fait suis aussi sous Windaube
      Installe un vrai système Gnu/Linux (VM) et après on causera.
      Tout ce qui n'est pas natif est source de complication.

      Pour l'erreur sed, c'est sans doute que tu encadres la syntaxe avec des quotes de début et de fin différentes ;-(
      0
  4. Tofdu31
     
    Arfff, si tu savais... c'est une contrainte boulot... Bien sur, suis totalement Linux chez moi.
    Mais parfois faut s'adapter.

    Du coup, dans l'obligation de continuer ainsi.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Tu es sous quelle version de Windows ? 10 j'espère…

      Demande-leur de t'installer WSL ;-)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Tofdu31
     
    Windows 10.

    J'ai déjà plein de script .bat fonctionnel. Et je ne peux vraiment pas outre passer Windows 10. Je sais on pourrait ouvrir le débat, suis totalement d'accord que l'acceptation de Linux dans l'environnement pro et tout de même une sage décision. Mais bon, pas évident de convaincre des DSI qui veulent faire vivre un monde des années 2000 et plus qui n'existe plus.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Tu fais ce que tu veux, mais entre Cygwin et WSL je crois qu'il n'y a pas photo ;-\

      J'entends totalement que tu aies pléthore de scripts batch qui marchent, mais à faire ce que tu fais, ça reste du tricotage et rien de pro ;-(

      Si tu as cygwin d'installer, tu devrais pouvoir te faire installer WSL sans que ça rechigne de trop ;-)
      0
      1. Tofdu31 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Mouai...
        Merci pour avoir essayé dans tous les cas.
        0
      2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Tofdu31
         
        De rien, mais faut nous comprendre aussi. On te file des solutions qui marchent chez nous et tu reviens nous dire que ça marche pas chez toi.
        Ce n'est quand même pas à nous d'installer une VM avec Windows dans laquelle on va installer Cygwin, pour pouvoir trouver les bonnes syntaxes.

        C'est cru ce que je vais te dire, mais ce n'est pas à des bénévoles de trouver des solutions qui marchent pour des boîtes qui ne veulent pas faire l'effort de faciliter la vie de leurs employés !
        0
  7. Tofdu31
     
    Je comprends, d'ailleurs si tu reprends mes messages, ici comme chez developpez.com, j'apporte les explications de conversions et le résultat final fonctionnel pour que les internautes comprennent différence Windows Linux et y trouve de l'information qui apportera des solutions.

    Je laisse des écrits vraiment détaillés qui, à mon gout, répond à l'investissement de bénévoles dont j'ai toujours à la fois respecté mais aussi soutenue.

    Moi aussi suis bénévole dans l'informatique sur les Fablab et c'est énormément de temps consacrée aussi pour apporter du soutien. Donc ce que tu fais, je peux que le mesurer, le reconnaitre mais aussi remercier.

    Tof
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Oui oui j'ai vu tout ça, c'est tout à ton honneur et je t'en remercie aussi.

      Mais je reste sur l'idée que de vouloir mélanger scripts batch/bash ça reste de la tambouille indigeste et que tu ferais mieux de te lancer dans l'apprentissage de langage comme Perl ou Python, qui eux sont portables, faciles à apprendre d'après mes lectures, et intègrent nativement la plupart des outils que tu te sers dans tes scripts.
      0
    2. Tofdu31 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      A génial, merci à toi,

      Alors de mon coté, j'ai grave avancé.

      Pour commencer, je mets en place mes variables :
      Rem mise en place des variables pour creation fichier xml
      set applicationID=ICI LA LIGNE A RAJOUTER AU DEBUT
      set ligne_first=[{\"packageName\":\"%applicationID%\",\"permissions\":[
      set before_permission={"name":"
      set val_after_permission=\",\"value\":\"1\"},
      set val_end_of_last_line=]}]


      Dans mon .bat, je vérifie que mes variables sont correctes :
      echo %ligne_first%
      echo %before_permission%
      echo %val_end_of_last_line%


      Là tout est bon.

      Enfin, j'ai testé sans variable ma ligne de commande avec un mot TOTO et TATA
      %sed% -e "1i%ligne_first%" -e "s/.*/TOTO&/" -e "s/$/TATA,/" fichier_donnee.csv >> Final.xml


      Le résultat attendu est bon avec TOTO et TATA
      ICI LA LIGNE A RAJOUTER AU DEBUT
      TOTOandroid.permission.INTERNETTATA
      TOTOandroid.permission.WRITE_EXTERNAL_STORAGETATA
      TOTOandroid.permission.ACCESS_NETWORK_STATETATA
      TOTOandroid.permission.BLUETOOTHTATA
      TOTOandroid.permission.BLUETOOTH_ADMINTATA
      TOTOandroid.permission.ACCESS_WIFI_STATETATA
      TOTOandroid.permission.READ_PHONE_STATETATA



      Alors le souci, dés que je place ma variable %before_permission% là ça va plus. j'ai une erreur :
      La commande :
      %sed% -e "1i%ligne_first%" -e "s/.*/%before_permission%&/" -e "s/$/TATA,/" fichier_donnee.csv >> Final.xml

      Erreur:
      sed.exe: -e expression n°2, caractère 11: commande `s' inachevée


      Par contre si je replace la première variable utilisé, là ça pose pas de probléme...
      %sed% -e "1i%ligne_first%" -e "s/.*/%ligne_first%&/" -e "s/$/TATA,/" fichier_donnee.csv >> Final.xml

      Incroyable...

      Si tu as une idée. Je vais de ce pas lire le lien pour trouver de l'info.

      Tof
      0
    3. Tofdu31 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Je pense que je vais partir sur ceci :

      https://www.it-connect.fr/lister-le-contenu-dun-fichier-texte-en-batch/
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Tofdu31
       
      À te lancer dans les scripts batch, autant voir à ce moment là du côté de Power Shell, qui a l'air beaucoup plus complet et performant…
      0
  8. Pat
     
    Bonsoir,

    Lorsque vous connaissez le format du csv fichier et la structure dont vous avez besoin dans le xml fichier, il est assez simple de créer un script capable de gérer la conversion.

    Prenez le fichier simple.csv:

    Jack,35,United States
    Jill,22,United Kingdom
    Vous pouvez créer le xml fichier suivant :

    <?xml version="1.0"?>
    <Customers>
    <Customer>
    <Name>Jack</Name>
    <Age>35</Age>
    <Country>United States</Country>
    </Customer>
    <Customer>
    <Name>Jill</Name>
    <Age>22</Age>
    <Country>United Kingdom</Country>
    </Customer>
    </Customers>
    Avec le script suivant:

    #!/bin/bash
    file_in="simple.csv"
    file_out="simple.xml"
    echo '<?xml version="1.0"?>' > $file_out
    echo '<Customers>' >> $file_out
    while IFS=$',' read -r -a arry
    do
      echo '  <Customer>' >> $file_out
      echo '    <Name>'${arry[0]}'</Name>' >> $file_out
      echo '    <Age>'${arry[1]}'</Age>' >> $file_out
      echo '    <Country>'${arry[2]}'</Country>' >> $file_out
      echo '  </Customer>' >> $file_out
    done < $file_in
    echo '</Customers>' >> $file_out

    Même si vous n'avez jamais codé auparavant, je pense que cela devrait être facile à utiliser et à modifier. Le fichier est lu ligne par ligne dans la whileboucle.

    IFSest le spécificateur de champ interne. Le IFS=$','déclare que la valeur du séparateur de champ est une virgule. Ceci est standard pour un fichier CSV, mais il peut être modifié selon les besoins pour correspondre au format de fichier d'entrée.

    L' -rargument de la readcommande lui indique de traiter toutes les barres obliques inverses dans votre fichier comme faisant partie de vos données plutôt que comme un échappement pour un caractère spécial suivant.

    L' -a arryargument place chaque colonne de votre fichier dans un tableau (nommé arry). Les colonnes de cet exemple sont le nom, l'âge, le pays. En d'autres termes, les valeurs entre les virgules. Ainsi, chaque colonne de la ligne est stockée dans un tableau.

    Ensuite, le texte nécessaire pour xmlest simplement enroulé autour des valeurs et la xmlligne est ajoutée au fichier de sortie avec echo.

    Mais plus simple :
    Sur le site Web de la communauté sur la conversion, il existe un lien vers un outil en ligne de commande appelé csv2xml .
    Une solution assez conviviale (c'est-à-dire facile à utiliser pour moi) au défi de conversion CSV en XML consiste à utiliser un bel éditeur XML multiplateforme qui intègre cette fonctionnalité. (Je l'ai utilisé à la fois sous Ubuntu et Mac OSX 10.10.5; il a également un exécutable Windows.)
    0