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

Shell et commandes GNU Discussion :

Formatage de fichier csv


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut Formatage de fichier csv
    Bonjour

    Je cherche à redonner à un fichier csv (issu d xls) une structure ou le nombre de colonnes est constant (4 dans l exemple ci-dessous)

    Je vous expose mon problème par l'exemple

    Le fichier en entré

    1;2;3;4
    10;20;"ceci est
    une seule colonne";40
    100;200;300;400
    Resultat "recherché" (avoir un nombre de colonne constant)

    1;2;3;4
    10;20;"ceci est une seule colonne";40
    100;200;300;400
    OS : HP-UX
    Shell : ksh

    Merci de votre aide

  2. #2
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Faut-il se baser sur les guillemets ouverts (et chercher les guillemets fermés associés) ou juste sur le nombre de ";" dans la ligne ?

    Peut-il y avoir un point-virgule dans la chaine ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut
    Je pense qu il faut gerer les 2

    Les guillemets me permette de localiser les lignes completes par rapport au lignes incompletes et les Guillemets les "Chaines" à reformater (la coller à la ligne precedente)

    Normalement je ne dois par avoir de ; dans la partie Chaine

    Car il peut y avoir le cas encore plus delicat (2 colonnes consecutives avec ce format de type texte d ou les guillements)
    10;20;"ceci est
    une seule colonne";"et une
    autre colonne";40
    et on devrait avoir
    10;20;"ceci est une seule colonne";"et une autre colonne";40
    PS: merci pour la rapidité de la réponse

  4. #4
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Une solution très simple (utilise gnu sed) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r ':a;/(.*;){3,}/b;N;s/\n/ /;ba'
    Le 3 représente le nombre de points-virgules attendu dans chaque ligne (vu que c'est constant).

    J'espère que ça suffira à tes besoins.

    Edit : ok, il faudrait peut-être que je gère les guillemets, en fait.
    Je reposte si j'y arrive.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut
    J aime bien ta notion du simple

    Sinon dans sed pas gnu j ai pas l option -r

    et sur une plate forme de production je ne suis pas pret de l avoir

    Je ne pense par pouvoir echapper de toute façon à une boucle

  6. #6
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Essaie l'option -E de sed, alors. Ca fait la même chose (regexp étendues), ça dépend juste de la version du sed. Si tu n'as pas -E non plus, regarde le man ou dis-le, je modifierai le script.

    Et pour la notion de simple, tu vas comprendre dans 2 lignes. Voilà une version qui regroupe les lignes quand il n'y a pas 3 points-virgules ou quand il y a un nombre impair de guillemets :

    Code GNU sed : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r ':a;/(.*;){3,}/{/^[^"]*(([^"]*"){2})*[^"]*$/b};N;s/\n/ /;ba'

    La même chose, mais en beaucoup plus portable :
    Code script.sed : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    :a
    /(.*;){3,}/{
      /^[^"]*(([^"]*"){2})*[^"]*$/b
    }
    N;s/\n/ /
    ba
    Si cette version ne gère pas tous les cas, il vaudra mieux passer à un outil plus évolué (perl, awk...).

Discussions similaires

  1. Formatage date de fichier CSV
    Par ala1986 dans le forum BIRT
    Réponses: 4
    Dernier message: 12/04/2012, 19h08
  2. [PowerShell] Formatage d'un fichier csv
    Par lakcil dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 04/04/2011, 20h02
  3. Réponses: 13
    Dernier message: 03/12/2008, 13h54
  4. problème de formatage de fichier CSV
    Par HA-MS dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/09/2007, 11h39
  5. Formatage d'un fichier .CSV
    Par Riko1 dans le forum Langage
    Réponses: 1
    Dernier message: 16/02/2007, 11h50

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