#1 Le 21/06/2011, à 15:38
- chtitbidule
Traitement fichier CSV : champ contenant des retour à la ligne ...
Bonjour à toutes et à tous,
Si je me permets de vous solliciter aujourd'hui, c'est que j'ai quasiment tout essayé mais je ne trouve pas la réponse tout seul ...
Voici ma problématique :
Je souhaite manipuler un fichier CSV (séparateur ";") avec awk pour réorganiser les colonnes. Ce fichier est le résultat d'une exportation depuis un logiciel de gestion commerciale. Or il présente un petit souci auquel je n'arrive pas à faire face ...
Ligne 1 : champ1;champ2;champ3;champ4;
Ligne 2 : champ1;champ2
sur plusieurs
lignes;champ3;champ4;
Ligne 3 : champ1;champ2;champ3;champ4;
Ligne 4 : champ1;champ2;champ3;champ4;
Ligne 5 : champ1;champ2
sur plusieurs
lignes;champ3;champ4;
Comment faire pour supprimer les saut de lignes des champs2 qui sont décomposés en plusieurs lignes ?
Merci d'avance pour vos propositions !!!
Hors ligne
#2 Le 21/06/2011, à 18:05
- Compte supprimé
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
As-tu essayé en ouvrant avec un traitement de texte ? puis rechercher "retour à la ligne" et supprimer.
#3 Le 21/06/2011, à 18:32
- aduxas
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
Est-ce que tu t'attends toujours à quatre champs par ligne? Cela faciliterait bien la chose.
Hors ligne
#4 Le 21/06/2011, à 19:06
- pode
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
A condition que le nombre de champs soit effectivement constant (dans ton exemple : 5), la commande ci-dessous permet d'afficher tous les deuxième champs du fichier (en transformant chaque retour à la ligne surnuméraires en un espace)
$ awk ' BEGIN { FS = ";" } { nbchamps+=NF ; if (ligne == "") { ligne=$0 } else { ligne=ligne" "$0 } ; if ( nbchamps == 5 ) { nbligne+=1 ; split(ligne, lignetab, ";"); print "Champ 2 de la ligne "nbligne" : "lignetab[2]; ligne=""; nbchamps=0 } else { nbchamps-=1 } } ' csv.in.orig
Champ 2 de la ligne 1 : champ2
Champ 2 de la ligne 2 : champ2 sur plusieurs lignes
Champ 2 de la ligne 3 : champ2
Champ 2 de la ligne 4 : champ2
Champ 2 de la ligne 5 : champ2 sur plusieurs lignes
A adapter selon les besoins
Hors ligne
#5 Le 21/06/2011, à 20:19
- aduxas
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
Autre solution: ceci colle les lignes jusqu'a ce qu'il y ait un point-virgule en fin de ligne. Dans ton exemple, les lignes incomplètes manquent toutes le point virgule final. L'avantage de cette commande est qu'elle n'a pas besoin d'un nombre de champs constant.
sed -i -e '/;$/\!{N;s/\n//}' fichier
Ce que je fais: si une ligne ne se termine pas en ";", je l'accumule dans l'espace de travail et je supprime la fin de ligne.
PS: il vaut mieux vérifier d'abord sans l'option -i car elle remplace le fichier d'entrée!
EDIT: J'ai changé un peu, mais ce n'est toujours pas au point, mon truc.
Dernière modification par aduxas (Le 21/06/2011, à 20:55)
Hors ligne
#6 Le 21/06/2011, à 20:58
- aduxas
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
Faire un fichier "SED" contenant
:t
/;$/!{
N
bt
}
s/\n//g
puis
sed -if SED fichier
Ceci fait exactement ce que je veux, mais je ne sais pas pourqoui ma première solution ne colle qu'une seule ligne.
Hors ligne
#7 Le 21/06/2011, à 22:34
- aduxas
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
Bon, on dirait que c'est comme ca: si on veut coller plus de 2 lignes avec N, il faut utiliser un label. Sans fichier script:
sed -ie ':t;/;$/\!{N;s/\n//;bt}' fichier
Hors ligne
#8 Le 22/06/2011, à 11:19
- FRUiT
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
En même temps, tu viens poster dans un forum ubuntu, ce serait peut-être la moindre des choses de préciser que tu es sur macOS, afin d'éviter que les gens perdent leur temps !
No comment sur la multiplication des topics !
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#9 Le 22/06/2011, à 15:28
- aduxas
Re : Traitement fichier CSV : champ contenant des retour à la ligne ...
Pfff, ils y proposent la même solution mais trébuchent sur \r ^M \n D'ailleurs, macOS, c'est du FreeBSD dilué, non?
Hors ligne