IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unix Discussion :

Traitement fichier CSV : comment gérer un champ contenant des caractère de saut de ligne ? (mac OS X)


Sujet :

Unix

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    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 !!!

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Avec "sed" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut zipe31,

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

    Merci au fait !!!

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    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 !

  6. #6
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    lorsque j'édite le fichier dans vim, j'ai un ^M à la fin de chaque ligne
    Cherche plus ;-(

    Essaies comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;N;$!bz;s/\([^;]\)\r\n/\1 /g'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Pas mieux ... ;(

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Est-ce que je peux t'envoyer ça en MP ?

  10. #10
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Oui bien sûr
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Pas possible de t'envoyer un MP ;(

    Ton profil n'accepte pas les MP

  12. #12
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    c'est modifié
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  13. #13
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Ok, la sortie ressemble à ça (sans les "$" après le ^M) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;N;$!bz;s/\([^;]\)\r/\1 /g'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  14. #14
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    merci beaucoup zipe31 pour ton aide précieuse ! J'espère que cela pourra aider d'autres utilisateurs ...

  16. #16
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Il est résolu le problème ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  17. #17
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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.

  18. #18
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    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

  19. #19
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    [size=1]
    http://xrenault.developpez.com

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  2. Réponses: 11
    Dernier message: 27/10/2008, 09h15
  3. Traitement fichiers csv
    Par athra dans le forum Forms
    Réponses: 0
    Dernier message: 20/06/2008, 11h17
  4. [HTML] Parcours d'une table HTML pour creer un fichier CSV : comment faire ?
    Par Thomus38 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 28/06/2007, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo