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

Fermé
Tofdu31 - Modifié le 2 févr. 2021 à 12:06
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 2 févr. 2021 à 12:11
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
A voir également:

7 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 08:12
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 10:41
Ça c'est un batch Windows. Aucun intérêt ici.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 11:20
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 12:09
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 13:41
Tu es sous quelle version de Windows ? 10 j'espère…

Demande-leur de t'installer WSL ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 13:49
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
Tofdu31 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
28 nov. 2020 à 13:55
Mouai...
Merci pour avoir essayé dans tous les cas.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417 > Tofdu31
28 nov. 2020 à 14:03
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
28 nov. 2020 à 14:13
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 nov. 2020 à 10:15
Okazou… je pose ça là : La puissance des outils Gnu/Linux sous Windows ;-)
0
Tofdu31 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
Modifié le 29 nov. 2020 à 11:20
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
Tofdu31 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
29 nov. 2020 à 11:23
Je pense que je vais partir sur ceci :

https://www.it-connect.fr/lister-le-contenu-dun-fichier-texte-en-batch/
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417 > Tofdu31
29 nov. 2020 à 11:27
À 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
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