Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 15h52   #1
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Par défaut Traitement fichier CSV : comment gérer un champ contenant des caractère de saut de ligne ? (mac OS X)

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 !!!
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h02   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Avec "sed" ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat plop
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;

$ sed ':z;N;$!bz;s/\([^;]\)\n/\1 /g' plop
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;

$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 16h30   #3
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Salut zipe31,

C'est bien le résultat que je souhaiterais ... Cependant ça ne fonctionne toujours pas ...

Merci au fait !!!
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h36   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par chtitbidule Voir le message
Salut zipe31,

C'est bien le résultat que je souhaiterais ... Cependant ça ne fonctionne toujours pas ...
Ok, mais sans plus de détails difficile de faire quoi que ce soit

Système d'exploitation ?
Shell ?
Version de sed ?
Fin de ligne du fichier ?

Quel résultat obtiens-tu ?
Des messages d'erreurs ?
etc.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h45   #5
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Alors tout d'abord je ne suis pas vraiment un pro du shell ... C'est pour ça que je viens demander à des pros comme vous ...

Système d'exploitation ? Mac OS X 10.6
Shell ? bash
Version de sed ? je ne sais pas comment je peux voir la version
Fin de ligne du fichier ? lorsque j'édite le fichier dans vim, j'ai un ^M à la fin de chaque ligne. Les lignes correctes se terminent toutes par ";" ... Lorsqu'il s'agit d'un champ sur plusieurs lignes, il n'y a pas de ";" ...

Quel résultat obtiens-tu ? Il n'y a aucune différence entre le fichier d'entrée et celui de sortie
Des messages d'erreurs ? Aucun ...
etc.

Merci encore pour ton aide !
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 16h52   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
lorsque j'édite le fichier dans vim, j'ai un ^M à la fin de chaque ligne
Cherche plus ;-(

Essaies comme ça :

Code :
sed ':z;N;$!bz;s/\([^;]\)\r\n/\1 /g'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h01   #7
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Pas mieux ... ;(
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h05   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Affiche la sortie de cat -A ton_fichier, d'une partie seulement ou du moins un exemple avec les mêmes fin de lignes que sur le fichier original.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h08   #9
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Est-ce que je peux t'envoyer ça en MP ?
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h11   #10
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Oui bien sûr
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h12   #11
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Pas possible de t'envoyer un MP ;(

Ton profil n'accepte pas les MP
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h17   #12
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
c'est modifié
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 17h31   #13
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok, la sortie ressemble à ça (sans les "$" après le ^M) :

Code :
1
2
3
4
5
6
7
8
9
10
$ cat -A plop 
Ligne 1 : champ1;champ2;champ3;champ4;^M$
Ligne 2 : champ1;champ2^M$
sur plusieurs^M$
lignes;champ3;champ4;^M$
Ligne 3 : champ1;champ2;champ3;champ4;^M$
Ligne 4 : champ1;champ2;champ3;champ4;^M$
Ligne 5 : champ1;champ2^M$
sur plusieurs^M$
lignes;champ3;champ4;^M$
Essaie ça sans trop de conviction vu que je ne peux tester :

Code :
sed ':z;N;$!bz;s/\([^;]\)\r/\1 /g'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 18h54   #14
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Bon en investiguant en MP il s'avère que c'est sûrement la version de "sed" sur Mac OS X qui fasse des siennes

Donc pour expliquer la syntaxe employée...

:z
On définit une étiquette de branchement (boucle)

N
On ajoute la ligne suivante dans la mémoire principale

$ !b z
Si on n'a pas atteint la dernière ligne ($ !) on se branche à l'étiquette "z" (b z) et on boucle

Une fois que la dernière ligne est atteinte la mémoire principale de sed ressemble à ça :
Code :
Ligne 1 : champ1;champ2;champ3;champ4;\r\nLigne 2 : champ1;champ2\r\nsur plusieurs\r\nlignes;champ3;champ4;\r\nLigne 3 : champ1;champ2;champ3;champ4;\r\nLigne 4 : champ1;champ2;champ3;champ4;\r\nLigne 5 : champ1;champ2\r\nsur plusieurs\r\nlignes;champ3;champ4;\r$
En bleu les bons retours à la ligne
En rouge ceux qu'il faut changer
Donc la substitution avec "sed" devra ne prendre en compte que les fin de lignes qui ne seront pas précédées d'un point virgule.

s/\([^;]\)\r\n/\1 /g
C'est ce que fait cette commande qui matche une fin de ligne composée d'un retour chariot (\r ou \x0D) et d'une fin de ligne (\n ou \x0A) précédés de tout autre caractère qu'un point virgule ([^;]). Ce dernier étant entre parenthèse protégées "\(...\)" pour constituer une sous-expression réutilisable dans la partie droite de la substitution sous la forme "\1".
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 19h22   #15
Invité de passage
 
Kévin Kévin BROCARD
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Kévin Kévin BROCARD
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
merci beaucoup zipe31 pour ton aide précieuse ! J'espère que cela pourra aider d'autres utilisateurs ...
chtitbidule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 22h16   #16
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 950
Points : 4 950
Il est résolu le problème ?
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 23h06   #17
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par troumad Voir le message
Il est résolu le problème ?
En partie... ça marche sous GNU/Linux mais pas sous Mac OS X
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 00h05   #18
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 982
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 982
Points : 6 101
Points : 6 101
Bonsoir.

C'est encore probablement du au fait que le sed de mac est POSIX et non GNU.
Je déplace donc dans les Unix.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 15h13   #19
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
Code :
cat input_file.txt | awk '/^Ligne/{printf "\n" $0} !/^Ligne/{printf $0}'
En partant du principe évidement que dans tes données sur plusieurs ligne, il n'y ai pas le mot "Ligne".

Le seul inconvénient, c'est que ça t'ajoute une ligne vide en tête de fichier, mais ça se supprime aisément.
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h54.


 
 
 
 
Partenaires

Hébergement Web