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 :

[bash] utilisation de CAT/AWK pour parser un fichier CSV


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut [bash] utilisation de CAT/AWK pour parser un fichier CSV
    Bonjour,

    J'aimerai parser un fichier CSV qui contient 3 colonnes.

    J'ai essayé avec awk et une boucle for, mais cela ne fonctionne pas. J'aimerai aussi récupérer la valeur d'une colonne/ligne dans des variables $NOM, $PRENOM, $ PASSWORD pour effectuer un traitement par la suite.
    Je pense que tout le traitement doit se faire dans une boucle final pour effectuer le traitement de toutes mes lignes/colonnes de mon fichier CSV

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    # file_read
     
    for i in `cat /home/afourquemin/file.csv`
    do
    echo $i
     
    $USER=`echo $i | awk '{ print $1 }'`
    echo $USER
     
    done
     
    #cat /home/afourquemin/file.csv | awk '{ print $2 }'
    #cat /home/afourquemin/file.csv | awk '{ print $3 }'
    Merci d'avance

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    La boucle me semble inutile puisque awk travaille ligne par ligne. Mais sans exemple, c'est difficile de se prononcer.

    Donne-nous un exemple typique en expliquant bien ce que tu veux capturer.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    ok désolé

    fichier CSV :

    Arnaud;stan;gtfED45
    Toto;robert;4554d
    Mickeal;dupont;554fd

    ensuite j'aimerai pouvoir lire ce fichier ligne par ligne, en récupérant :

    $PRENOM="arnaud"
    $NOM="stan"
    $PASSWORD="gtfED45"

    pour ensuite traiter ces variables... jusqu'a la fin du fichier

  4. #4
    Membre éclairé 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
    Points : 652
    Points
    652
    Par défaut
    Ça doit correspondre à ce que tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for enreg in `cat /home/afourquemin/file.csv`
    do
        echo $enreg
        USER=`echo $enreg | awk -F";" '{ print $1 }'`
        NOM=`echo $enreg | awk -F";" '{ print $2 }'`
        PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
        echo "$USER - $NOM - $PASSWORD"
        #
        ### ton traitement
        #
    done
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    J'avais fais quelque chose de similaire, mais avec ton script, comme le mien, il y a une erreur :

    line 5:syntax error near unexpected token 'do
    line 5:'do

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Je ne comprend pas pourquoi ca ne fonctionne pas ! J'ai un bouquin sous les yeux et ils écrivent le for de la même manière !!!

  7. #7
    Membre éclairé 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
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par arnaudperfect
    J'avais fais quelque chose de similaire, mais avec ton script, comme le mien, il y a une erreur :

    line 5:syntax error near unexpected token 'do
    line 5:'do

    Si tu pouvais mettre en ligne la partie de ton script posant problème, ce serait plus facile pour t'aider
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    bah j'ai repris ton script en faite...

  9. #9
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Si tu veux juste récupérer une colonne, cut marche très bien aussi.
    Si le but est de lire le fichier ligne par ligne, utiliser while read sera plus rapide et plus propre.

    Le script de BlaireauOne marche bien chez moi (sous sh, bash et zsh). Je ne vois pas d'où peut venir le problème. Tu utilises bien Bash ?

    Eventuellement, essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read enreg; do
        echo $enreg
        USER=`echo $enreg | cut -d';' -f1`
        NOM=`echo $enreg | cut -d';' -f2`
        PASSWORD=`echo $enreg | cut -d';' -f3`
        echo "$USER - $NOM - $PASSWORD"
    done < /home/afourquemin/file.csv

  10. #10
    Membre éclairé 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
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par arnaudperfect
    bah j'ai repris ton script en faite...
    Un PB de copier/coller car chez moi, ça marche

    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
     
    cat > liste.txt <<EOD
    Arnaud;stan;gtfED45
    Toto;robert;4554d
    Mickeal;dupont;554fd
    EOD
     
    for enreg in `cat liste.txt`
    do
        echo $enreg
        USER=`echo $enreg | awk -F";" '{ print $1 }'`
        NOM=`echo $enreg | awk -F";" '{ print $2 }'`
        PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
        echo "$USER - $NOM - $PASSWORD"
        #
        ### ton traitement
        #
    done

    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Arnaud;stan;gtfED45
    Arnaud - stan - gtfED45
    Toto;robert;4554d
    Toto - robert - 4554d
    Mickeal;dupont;554fd
    Mickeal - dupont - 554fd
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    bah merde c'est bizarre !

    oui j'utilise bash sous fedora !

    je vais recopier le script !

    j'avais le même problème au boulot sur une fedora aussi !!

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    oué rien à faire, sur fedora aucun des scripts proposés ici ne marche...

    Je ne comprend pas...

  13. #13
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    bon, j'ai fais des petits exo sur le for,do,done pour me familliariser avec la syntaxe :

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ensemble="element1 element2 element3"
    ...
    ...
    for var in $ensemble ; do
      echo $var
    done
    Sur notre script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for enreg in `cat /home/afourquemin/file.csv`
    do
        echo $enreg
        USER=`echo $enreg | awk -F";" '{ print $1 }'`
        NOM=`echo $enreg | awk -F";" '{ print $2 }'`
        PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
        echo "$USER - $NOM - $PASSWORD"
        #
        ### ton traitement
        #
    done
    je pense que le problème vient de `cat /home/afourquemin/file.csv`...

    j'ai testé de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FICHIER=`cat /home/afourquemin/file.csv`
     
    for enreg in $FICHIER
    do
        echo $enreg
        USER=`echo $enreg | awk -F";" '{ print $1 }'`
        NOM=`echo $enreg | awk -F";" '{ print $2 }'`
        PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
        echo "$USER - $NOM - $PASSWORD"
        #
        ### ton traitement
        #
    done
    mais tjr le même problème !

    pourtant j'ai tester le cat et il semble bien fonctionné...

  14. #14
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Très étrange.

    Que donne "bash --version" ?
    Ni la version avec le for, ni celle avec le while ne fonctionnent ? Testes-tu en mode interactif ou par un script exécutable (essaie avec les deux) ?
    Essaie de simplifier les exemples donnés pour trouver d'où vient l'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i in 1 2 3 4; do
      echo $i
    done
    Est-ce que ce code fonctionne chez toi ?

    EDIT: je viens de voir ta réponse entre temps. Si le problème vient du cat, est-ce que ça marche avec le while read ?

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    tien une question,

    si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    # file_read
    FICHIER=`cat /home/afourquemin/file.cvs`
    echo $FICHIER
     
    Reponse :
    ./file_read: line 3: Jean;lapin;gjjfjdeje : command not found
     
    fin
    c'est normale le "command not found" ? et le blanc entre l'erreur et "fin"...

  16. #16
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Visiblement, on n'a vraiment pas la même version de Bash...

    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FICHIER=$(cat /home/afourquemin/file.cvs)
    Comment appelles-tu ton script ? Pourquoi "fin" s'affiche ? La ligne vide, c'est parce que ton $FICHIER est vide (à cause de l'erreur). Essaie de donner des copier-coller exacts de ce que tu fais.

  17. #17
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in 1 2 3 4; do
      echo $i
    done
    oui ca fonctionne !

    bash --version :

    GNU bash, version 3.1.17(1) - release (1686-redhat-linux-gnu)
    Copyright (c) 2005 Free Software Foundation, Inc.

    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
    #!/bin/bash
    # file_read
    while read enreg; do
        echo $enreg
        USER=`echo $enreg | cut -d';' -f1`
        NOM=`echo $enreg | cut -d';' -f2`
        PASSWORD=`echo $enreg | cut -d';' -f3`
        echo "$USER - $NOM - $PASSWORD"
    done < /home/root/scripts/file.csv
     
     
     
    [root@localhost scripts]# ./file_read 
    ./file_read: line 9: syntax error near unexpected token `done'
    ./file_read: line 9: `done < /home/root/scripts/file.csv'

  18. #18
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par LLB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FICHIER=$(cat /home/afourquemin/file.cvs)
    ca marche cette syntaxe !!! je vais testé avec le reste du script >

    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
    #!/bin/bash
    # file_read
    FICHIER=$(cat /home/root/scripts/file.csv)
    echo $FICHIER
     
    for enreg in $FICHIER ; do
        echo $enreg
        USER=`echo $enreg | awk -F";" '{ print $1 }'`
        NOM=`echo $enreg | awk -F";" '{ print $2 }'`
        PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
        echo "$USER - $NOM - $PASSWORD"
        #
        ### ton traitement
        #
    done
     
     
     
    [root@localhost scripts]# ./file_read 
    Jean;lapin;ghsdfjkdf antoine;petit;54sfsdf Jean-François;Saint-James;55454df Mikeal;dubois;; emmanuel;grout;dfklpsdf arnaud;fourquemin;;
    '/file_read: line 6: syntax error near unexpected token `do
    '/file_read: line 6: `for enreg in $FICHIER ; do
    le soucie va rester que j'espère que cette syntaxe soit portable...

  19. #19
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par arnaudperfect
    le soucie va rester que j'espère que cette syntaxe soit portable...
    Je suppose que ce code va marcher aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FICHIER="`cat /home/afourquemin/file.cvs`"
    Personnellement, je préfère $( ).

    Ton fichier d'entrée, c'est bien celui que tu avais donné avant ?

    En protégeant bien les variables, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read enreg; do
        echo $enreg
        USER=$(echo "$enreg" | cut -d';' -f1)
        NOM=$(echo "$enreg" | cut -d';' -f2)
        PASSWORD=$(echo "$enreg" | cut -d';' -f3)
        echo "$USER - $NOM - $PASSWORD"
    done < /home/root/scripts/file.csv

  20. #20
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    je pense que les ; sont interprétés avec le for...

    je vais tester tes lignes de codes

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

Discussions similaires

  1. duree pour parser un fichier avec un script awk
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/03/2008, 16h35
  2. fonction pour parser un fichier
    Par Dirty Harry dans le forum Langage
    Réponses: 7
    Dernier message: 30/01/2007, 05h13
  3. Réponses: 2
    Dernier message: 14/09/2006, 15h22
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  5. [SAX] Probleme pour parser un fichier
    Par aymron dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/11/2005, 15h48

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