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

  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...).

  7. #7
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut
    j ai un sed tres .... short
    man
    sed [-n] [-e script] [-f source_file] [file...]

  8. #8
    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
    Dernière tentative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    :a
    /\(.*;\)\{3,\}/{
      /^[^"]*\(\([^"]*"\)\{2\}\)*[^"]*$/b
    }
    N;s/\n/ /
    ba
    Sinon, j'abandonne. J'avais pourtant pris la peine de tester sur 3 sed différents.

  9. #9
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut
    J avais essayé de mon coté avec tes scripts mais sans resultats

    Et bien merci tout de meme pour les reponses

    J en aurai vu un peu plus sur le sed


  10. #10
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Pas très compact, mais ça fonctionne avec tes exemples

    liste.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1;2;3;4
    10;20;"ceci est
    une seule colonne";40
    100;200;300;400 
    10;20;"ceci est
    une seule colonne";"et une 
    autre colonne";40
    Résultat du awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1;2;3;4
    10;20;"ceci estune seule colonne";40
    100;200;300;400 
    10;20;"ceci estune seule colonne";"et une autre colonne";40


    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
    20
    21
    22
    23
     
    awk -F";" '
    {
    	#-- CourantNbreQuote = Nombre de double-quote dans enreg. courant
    	CourantNbreQuote=gsub(/"/,"\"",$0)
    	CumulNbreQuote=CourantNbreQuote+PrecedNbreQuote
    	if (CumulNbreQuote == 0) {
    		PrecedNbreQuote=0
    		print $0
    		next
    	}
    	modulo=CumulNbreQuote%2
    	if (modulo == 0) {
    		PrecedNbreQuote=0
    		print $0
    		next
    	}
    	#
    	#-- Nombre de double-quote impair, ecriture enreg. sans NewLine 
    	#
    	PrecedNbreQuote=CumulNbreQuote
    	printf("%s",$0)
    } ' liste.txt

  11. #11
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 16
    Par défaut
    Merci
    pil poil ce qu'il me faut

    PS: je vais ressortir mon bouquin d'Awk


    Y a t il moyen de gerer egalement ce cas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    1;2;3;4
    10;20;"ceci est
    une
    seule 
    colonne";40
    100;200;300;400
    1000;2000;"ceci est
    une seule 
    colonne";"et 
    une
    autre 
    colonne";4000

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