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 :

Script : utilisation de CAT/AWK pour parser un fichier CSV


Sujet :

Shell et commandes GNU

Vue hybride

hackmed Script : utilisation de... 10/08/2017, 17h34
becket Salut, Quelque chose... 10/08/2017, 18h28
N_BaH Comment lire un fichier en... 10/08/2017, 20h09
jack-ft Y a un quote... 11/08/2017, 02h12
hizoka Salut, autant utiliser... 11/08/2017, 08h53
hackmed Je vous remercie infiniment... 11/08/2017, 20h38
disedorgue Bonjour, Ou plus... 13/08/2017, 12h08
hizoka Intéressant ça, je ne savais... 13/08/2017, 12h23
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 61
    Par défaut Script : utilisation de CAT/AWK pour parser un fichier CSV
    Bonjour,

    J'aimerai parser un fichier CSV qui contient 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 $DATE, $MONTANT, 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

    fichier CSV:
    10082017 700euro
    10052017 50euro
    10072017 100euro
    10862017 73euro

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

    COMMANDE:
    ->> '$date',decode(cb.trans_amt,'$montant','OK','KO'),

    SORTIE SOUHAITE :
    ->> '10082017',decode(cb.trans_amt,'700euro','OK','KO'),
    ->> '10052017 ',decode(cb.trans_amt,'50euro','OK','KO'),
    ...
    ....

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

    Le script joué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for enreg in `cat /home/afourquemin/file.csv`
    do
        echo $enreg
        DATE=`echo $enreg | awk -F";" '{ print $1 }'`
        MONTANT=`echo $enreg | awk -F";" '{ print $2 }'`    
    done
    Je vous remercie par avance de votre aide.

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Salut,

    Quelque chose comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat fichier.csv
    10082017 700euro
    10052017 50euro
    10072017 100euro
    10862017 73euro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat traitement.awk
    {
     print "'"$1"',decode(cb.trans_amt,'"$2"'','OK','KO'),"
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -f traitement.awk fichier.csv
    '10082017',decode(cb.trans_amt,'700euro'','OK','KO'),
    '10052017',decode(cb.trans_amt,'50euro'','OK','KO'),
    '10072017',decode(cb.trans_amt,'100euro'','OK','KO'),
    '10862017',decode(cb.trans_amt,'73euro'','OK','KO'),

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 644
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 644
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par becket Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat traitement.awk
    {
     print "'"$1"',decode(cb.trans_amt,'"$2"'','OK','KO'),"
    }
    [
    Y a un quote superfétatoire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat traitement.awk
    {
     print "'"$1"',decode(cb.trans_amt,'"$2"','OK','KO'),"
    }

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    autant utiliser bash sans awk ou cut ou quoi que ce soit d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read code prix
    do
       echo "'${code}' ,decode(cb.trans_amt,'${prix}','OK','KO'),"
    done < traitement.awk
     
    '10082017' ,decode(cb.trans_amt,'700euro','OK','KO'),
    '10052017' ,decode(cb.trans_amt,'50euro','OK','KO'),
    '10072017' ,decode(cb.trans_amt,'100euro','OK','KO'),
    '10862017' ,decode(cb.trans_amt,'73euro','OK','KO'),

  6. #6
    Membre confirmé
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 61
    Par défaut
    Je vous remercie infiniment pour vos réponses.
    Ça marche parfaitement tous vos scripts.
    Sujet clos

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Bonjour,
    Citation Envoyé par hizoka Voir le message
    Salut,

    autant utiliser bash sans awk ou cut ou quoi que ce soit d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read code prix
    do
       echo "'${code}' ,decode(cb.trans_amt,'${prix}','OK','KO'),"
    done < traitement.awk
     
    '10082017' ,decode(cb.trans_amt,'700euro','OK','KO'),
    '10052017' ,decode(cb.trans_amt,'50euro','OK','KO'),
    '10072017' ,decode(cb.trans_amt,'100euro','OK','KO'),
    '10862017' ,decode(cb.trans_amt,'73euro','OK','KO'),
    Ou plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat /tmp/fic1
    10082017 700euro
    10052017 50euro
    10072017 100euro
    10862017 73euro
    $ printf "'%s',decode(cb.trans_amt,'%s','OK','KO'),\n" $(< /tmp/fic1)
    '10082017',decode(cb.trans_amt,'700euro','OK','KO'),
    '10052017',decode(cb.trans_amt,'50euro','OK','KO'),
    '10072017',decode(cb.trans_amt,'100euro','OK','KO'),
    '10862017',decode(cb.trans_amt,'73euro','OK','KO'),

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Intéressant ça, je ne savais pas qu'on pouvait faire une boucle directe avec printf.

    Merci

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ou plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ printf "'%s',decode(cb.trans_amt,'%s','OK','KO'),\n" $(< /tmp/fic1)
    Attention Disedorgue! Le script de hizoka est plus robuste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat /tmp/fic2
    10082017 700euro
    10052017 50euro
    10062017 un petit peu plus
    10072017 100euro
    10862017 73euro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ printf "'%s',decode(cb.trans_amt,'%s','OK','KO'),\n" $(< /tmp/fic2)
    '10082017',decode(cb.trans_amt,'700euro','OK','KO'),
    '10052017',decode(cb.trans_amt,'50euro','OK','KO'),
    '10062017',decode(cb.trans_amt,'un','OK','KO'),
    'petit',decode(cb.trans_amt,'peu','OK','KO'),
    'plus',decode(cb.trans_amt,'10072017','OK','KO'),
    '100euro',decode(cb.trans_amt,'10862017','OK','KO'), # <- Tout décalé :-(
    '73euro',decode(cb.trans_amt,'','OK','KO'),
    !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ while read code prix; do echo "'${code}' ,decode(cb.trans_amt,'${prix}','OK','KO'),"; done < /tmp/fic2
    '10082017' ,decode(cb.trans_amt,'700euro','OK','KO'),
    '10052017' ,decode(cb.trans_amt,'50euro','OK','KO'),
    '10062017' ,decode(cb.trans_amt,'un petit peu plus','OK','KO'), # <- Yes! :-)
    '10072017' ,decode(cb.trans_amt,'100euro','OK','KO'),
    '10862017' ,decode(cb.trans_amt,'73euro','OK','KO'),

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script AWK pour modifier un fichier
    Par leanima dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 13/04/2012, 12h49
  2. Script shell pour parser un fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/09/2008, 09h32
  3. 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
  4. [bash] utilisation de CAT/AWK pour parser un fichier CSV
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 32
    Dernier message: 25/07/2007, 23h34
  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