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 :

awk fichier plat vers csv


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut awk fichier plat vers csv
    Hello les gens,
    Je dispose d'un fichier plat avec colonne fixe que je voudrais convertir en fichier csv.
    La structure du fichier est ont ne peut plus simple (pas de header ni de footer)
    Je souhaiterais qu'une âme charitable me soumette une commande (awk ?) qui soit aussi simple (je n'y connait pas grand chose au shell) à comprendre que mon fichier
    Je précise que j'ai juste besoin de la commande pour "découper les colonnes" (EDIT: en fait non, pas découper mais récupérer) ne vous tracassez pas avec autre chose.
    Merci pour toutes vos contributions.
    P.S:Avec le mode d'emploi ça serait bien si ce n'est pas trop demander.

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Si le séparateur est l'espace ' ' et qu'aucun autre n'apparait à l'intérieur des colonnes, alors la commande suivante fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat fichier_in | tr ' ' ',' > fichier_out

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Si le séparateur est l'espace ' '
    Tu n'a pas lu mon, post.
    Je dispose d'un fichier plat avec colonne fixe...
    La première colonne partira par exemple de la position 0->18
    La deuxième 22->23
    La troisième 24->38 etc...

  4. #4
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    man cut peut-être ?

    prend les 5 premiers caractères de chaque ligne du fichier test.

  5. #5
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par jadey Voir le message
    Tu n'a pas lu mon, post.

    La première colonne partira par exemple de la position 0->18
    La deuxième 22->23
    La troisième 24->38 etc...

    Que se cache t'il derrière le etc ? L'infini ? Du variable ? Une limite ?

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Que se cache t'il derrière le etc ? L'infini ? Du variable ? Une limite ?
    C'était pour illustrer qu'il y a plusieurs colonnes mais à la fin d'une ligne il y a un retour chariot
    cut -c1-5 test
    Oups.. c'est une très bonne solution mais je t'ai induit en erreur. Voir "EDIT" du premier post. Il me faudrait quelque chose de similaire mais qui laisse le fichier initial intact.

  7. #7
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    ?!

    Ben cut ne découpe pas le fichier lui même hein, comme tous les outils, il affiche le résultat de son opération sur la sortie standard.

    Exemple (crados):
    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
    $ cat test
    TOTO TOTO       3       EUROS
    TURLUTUTU     142,0     SCHMILBLIKS
    TSOINTSOIN   1249,123   BROUZOUFS
    $ cat test2.ksh
    #!/usr/bin/ksh
     
    while read ligne
    do
            echo `echo "$ligne" | cut -c1-12`';'`echo "$ligne" | cut -c13-24`';'`echo "$ligne" | cut -c24-37`
    done < test
    $ ./test2.ksh
    TOTO TOTO ; 3 ; EUROS
    TURLUTUTU ; 142,0 ; SCHMILBLIKS
    TSOINTSOIN ; 1249,123 ; BROUZOUFS

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Pour la découpe de champs de longueur fixe, GNU awk utilise une variable "builtin" bien pratique: FIELDWIDTHS.

    Un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat file
    123456789012345678901234567890
    aaaabbbcccccccddddddeeeeefffff
    
    $  awk -v FIELDWIDTHS="4 3 7 6 5 5 1 " -v OFS=";" '{print $1, $2, $3, $4 ,$5, $6}' file
    1234;567;8901234;567890;12345;67890
    aaaa;bbb;ccccccc;dddddd;eeeee;fffff
    Si tu n'as pas gawk mais seulement nawk ou pire, le awk traditionnel, j'ai une solution de rechange en stock.

  9. #9
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Merci bcp les gars c'est exactement ce que je recherchais.

  10. #10
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    ripat j'ai un comportement bizar avec ta solution awk, je m'explique j'ai des espace entre mes champs et ce que me retourne ta commande c'est exactement tous les champs de mon fichier en remplaçant la suite des espaces par un ";" ce qui est génial peu importe ce que je met en FIELDWIDTHS
    Seulement ce qui est moins génial c'est que sur mon fichier un chaps peut être "zappé" et donc remplacé par des espaces je me retrouve donc avec un csv qui contient des lignes avec plus ou moins de champs.
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v FIELDWIDTHS="1 8 7 6 5 5 1 " -v OFS=";" '{print $1, $2, $3, $4 ,$5, $6}' ${DIR_FILE_INPUT}/$1 > ${DIR_OUTPUT}/$1.csv
    une première ligne du fichier contenant par exemple:
    123456789 donnera sur le csv 12345679;
    ;;;;
    tandis que
    la ligne 12 34 56 7 8 9 donnera sur le csv 12;34;56;7;8;9

  11. #11
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    En fait il y'a quelqu'un qui décrit avoir le même souci ici post de TANAT 19h18

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Awk et sa variable FIELDWIDTHS ne fonctionneront que sur des lignes dont la répartition des champs est rigoureusement identique. Ne pas oublier qu'un espace compte pour un caractère.

    Le mieux est que tu donnes un exemple réaliste de fichier. Sinon on risque à jouer aux devinettes.

  13. #13
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Les lignes du fichier ne sont pas identiques: le contenu de certaines colonnes est remplacé par des espaces.
    Voici quand même un exemple:sample

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Ton fichier sample est bien de longueur fixe. Tant mieux. Avec FIELDWIDTHS il faut être très méthodique et ne pas se tromper dans le découpage. Aides-toi d'un éditeur qui affiche la position des caractères.

    Voici le début du découpage de ton fichier sample. Attention, pour une raison que je n'ai jamais vraiment cherché à comprendre, toujours terminer FIELDWIDTHS par 1. La chaîne fieldsToPrint contient les n° des champs que tu souhaites imprimer.

    Le snippet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat split.awk
    BEGIN{
      # découpage. Ne pas oublier les espaces et terminer par 1.
      FIELDWIDTHS="11 1 3 6 8 33 4 14 8 1 10 1"
    
      # liste des champs à imprimer
      fieldsToPrint="1 3 5 7 9 11"
      n=split(fieldsToPrint, a, " ")
    
    }
    {
      for(i=1;i<=n;i++) printf $a[i] ";"
      print ""
    }
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk -f split.awk sample
    SSFSSL_9999;TOT;SSL_0112;XXXX;I2410060;0000000082;
    SSFSSL_9999;TOT;SSL_0118;YYYY;I2410064;0000000008;
    A toi de continuer le travail. Si le ; final te gêne il y a facilement moyen de le supprimer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=1;i<=n;i++) printf "%s%s", $a[i],(i==n)?"":";"

  15. #15
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Je ne connaissais pas FIELDWIDTHS

  16. #16
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Je me prends ça:
    Syntax Error The source line is 1.
    The error context is
    <<< >>> BEGIN{
    awk: 0602-502 The statement cannot be correctly parsed. The source line is 1.
    Syntax Error The source line is 3.
    En executant ton snippet

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    As-tu bien mis le code awk dans un fichier et invoqué ce fichier avec awk -f snippet.awk fichier_in

    Le builtin FIELDWIDTHS ne marche qu'avec GNU awk. Quel awk utilises-tu?

  18. #18
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    As-tu bien mis le code awk dans un fichier et invoqué ce fichier avec awk -f snippet.awk fichier_in
    Absolument.
    Quel awk utilises-tu?
    awk --version -version --help -help rien ne marche
    C'est du aix 5.2.

  19. #19
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    bon j'ai converti le fichier au format unix j'ai plus d'erreurs.
    Je vérifie le comportement et je reviens.

  20. #20
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    bon awk n'en fait qu'a sa tête et semble faire fi des indications du builtin FIELDWIDTHS voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN{
      # découpage. Ne pas oublier les espaces et terminer par 1.
      FIELDWIDTHS="11 1 8 1 8 17 1 15 4 14 8 1 10 1 10 1 10 1 8 1 8 1 8 1 8 1 8 1 8 1 6 1 9 1 8 24 2 1 5 1 3 1 57 89 8 41 8 71 1"
     
      # liste des champs à imprimer
      fieldsToPrint="1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47"
      n=split(fieldsToPrint, a, " ")
     
    }
    {
      for(i=1;i<=n;i++) printf $a[i] ";"
      print ""
    }
    Tu pourrais regarder ce que cela donne comme résultat sur le fchier sample stp ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Exporter fichier XLS vers CSV
    Par arnaud_verlaine dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/09/2007, 18h47
  2. Réponses: 2
    Dernier message: 20/08/2007, 15h36
  3. [XML] fichier plat vers xml
    Par jasminrose dans le forum APIs
    Réponses: 22
    Dernier message: 16/04/2007, 18h37
  4. Conversion fichier plat vers CSV
    Par linar009 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/11/2006, 14h35
  5. Importation fichier plat vers Mysql
    Par xender dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/05/2006, 23h36

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