Pages : 1
#1 Le 03/12/2012, à 16:27
- gody
Script avec concaténation
Bonjour,
Je travail sur un script de traitement d'une extraction au format CVS.
Voici le à quoi ressemble le fichier à traiter.
email;etat;prenom;nom;liste;pays
info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1;france
;;;;5;;
;;;;3;;
;;;;2;;
infos@toto2.com;1;tata;tonton;1;mexique
;;;;2;;
info@toto3.com;1;;;2;france
On remarque que certaine ligne débutent par ;
Ce sont en faite les cellules fusionnés d'un tableau excel qui génère c'est ligne (je ne peux pas modifier le fichier excel bien entendu)
Le but du script et de récupérer le 5 eme champs des lignes commençant par ; et de le concaténer au 5 eme champ de la première ligne précédente ne commencant pas par ;
Le résultat serait semblable à celui ci.
info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1,5,3,2;france
infos@toto2.com;1;tata;tonton;1,2;mexique
info@toto3.com;1;;;2;france
J'ai cherché plusieurs façon de faire avec while ou sed ou les deux... mais rien de concluant pour le moment.
Un petit coup de pouce serait la bienvenu.
Merci
Hors ligne
#2 Le 03/12/2012, à 16:56
- tiramiseb
Re : Script avec concaténation
Moi j'y irais à la manière d'un gros bourrin :
mémorisation de chaine vide
tant que ligne pas vide {
si ligne commence par ";" {
ajouter 5me champ au champ de la ligne mémorisée
} sinon {
echo ligne mémorisée
mémorisation de la nouvelle ligne
}
}
echo dernière ligne mémorisée
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#3 Le 03/12/2012, à 17:04
- credenhill
Re : Script avec concaténation
hello
essayer
$ awk 'BEGIN{FS=OFS=";"} $0 !~ /^;/ {x[n++]=$0; next} {c=$5; $0=x[n-1]; $5=$5 "," c; x[n-1]=$0} END{for(m=0;m<n;)print x[m++]}' fichier.csv
info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1,5,3,2;france
infos@toto2.com;1;tata;tonton;1,2;mexique
info@toto3.com;1;;;2;france
$
Hors ligne
#4 Le 03/12/2012, à 17:24
- gody
Re : Script avec concaténation
Moi j'y irais à la manière d'un gros bourrin :
mémorisation de chaine vide
tant que ligne pas vide {
si ligne commence par ";" {
ajouter 5me champ au champ de la ligne mémorisée
} sinon {
echo ligne mémorisée
mémorisation de la nouvelle ligne
}
}
echo dernière ligne mémorisée
Merci à tous les deux pour vos réponses.
@credenhill: Cela fonctionne parfaitement, merci encore, je vais essayer l'autre proposition par curiosité
@tiramiseb: je ne sais pas comment conserver ma ligne précédente. J'écrase systématiquement son contenu quand on passe à la ligne suivante...
Hors ligne
#5 Le 03/12/2012, à 17:27
- tiramiseb
Re : Script avec concaténation
Tu stocke la valeur dans une autre variable, genre "ligne_memorisee=$ligne". Et après à coup de sed tu peux insérer la valeur de la nouvelle ligne lue.
Wow la commande awk est vachement courte. Ça a l'air efficace... Par contre j'y pige que dalle
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 03/12/2012, à 17:33
- pingouinux
Re : Script avec concaténation
Bonjour,
Autre solution avec awk, un peu plus longue que celle de credenhill #3 :
awk 'BEGIN{FS=";";OFS=";"} { if($0~/^;/) { c5=c5","$5; } else { lig=$0; if(ligold) { $0=ligold; $5=$5""c5; c5=""; print} ligold=lig } } END{if(ligold) { $0=ligold; $5=$5""c5;; print }}' fichier.csv
Hors ligne
#7 Le 03/12/2012, à 17:35
- tiramiseb
Re : Script avec concaténation
je peux pas m'empecher une blague nulle :
voir une ligne comme ça ça me donne envie de dire "awwwkkkkk"...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 03/12/2012, à 17:46
- pingouinux
Re : Script avec concaténation
@tiramiseb #7 : J'admets que cette commande peut paraître légèrement rébarbative, mais elle peut être décomposée en plusieurs lignes.
Hors ligne
#9 Le 03/12/2012, à 21:29
- gody
Re : Script avec concaténation
Est il possible avec sed d'avoir plusieurs motifs de recherche? je n'ai pas trouvé sur mon ami google.
sed 's/recherche1 ou recherche2/remplacement/g'
merci
Edit j'ai rien dit...
Dernière modification par gody (Le 03/12/2012, à 21:38)
Hors ligne
#10 Le 03/12/2012, à 21:34
- tiramiseb
Re : Script avec concaténation
si c'est pour du "ou", alors tu peux le faire en deux fois, ce sera plus facile à aborder :
sed 's/recherche1/replacement/g;s/recherche2/remplacement/g'
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#11 Le 03/12/2012, à 21:39
- gody
Re : Script avec concaténation
si c'est pour du "ou", alors tu peux le faire en deux fois, ce sera plus facile à aborder :
sed 's/recherche1/replacement/g;s/recherche2/remplacement/g'
J'avais oublié l'utilisation des parenthèses pour un ou logique...
sed -re '/;(Qc|QC)$/!d'
Hors ligne