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 :

Traitement de lignes consécutives fichier csv


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut Traitement de lignes consécutives fichier csv
    Bonjour à tous ,
    J'ai un problème assez particulier que je n'arrive toujours pas à resoudre ,
    Je dispose d'un fichier csv sous cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    4311474K;U3TP;MT201403;3;U3TP;           -3;           0;;Non Declechement;;;;
    4508678M;MABS;MT201403;0;MABS;         3063;           0;;Non Declechement;;;;
    4509272H;U2AB;MT201403;0;U2AB;         2018;           0;;Non Declechement;;;;
    4610973C;UVGUVJUVLS;MT201403;3;UVGUVJUVLS;           -5;           0;;Non Declechement;;;;
    et en fait je voudrais traiter ce fichier par lignes consecutives pour ensuite charger dans une base oracle .
    pour le traitement , je veux traiter la ligne i en changeant certaines colonnes si
    ligne(i).champs5 = ligne(i+1).champs5
    ligne(i).champs4=1 et ligne(i+1).champs4 =3
    ligne(i).champs7 = ligne(i+1).champs6

    et ainsi de suite pour le reste du fichier .
    Si vous avez des idées de comment on peut verifier ces conditions
    Merci d'avance pour votre aide !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    Bonjour,

    awk est l'outil qu'il faut :
    - enregistrer la première ligne dans une variable ligne_i.
    - découper la variable ligne_i dans un tableau (avec split())
    - comparer et faire ce qui doit l'être
    - enregistrer la ligne courante dans la variable ligne_i
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Merci N Bah pour ta réponse
    Je vais voir ce que ça donne avec awk car ma première solution a été d'essayer avec sed mais sans succès .
    Si j'ai bien compris je split les lignes i et i+1 dans un tableau et je compare les champs , ensuite j'enregistre la ligne courante dans $ligne_i .
    Avec cette solution , est ce que c'est possible de parcourir toutes les lignes 2 à 2 du fichier ?

    Je reviens vers toi au plus vite .
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    tu ssplit uniquement la variable dans laquelle est stockée la ligne précédente; les champs de la ligne courante sont accessibles dans $1,$2..., en fonction du séparateur de champs défini, soit par une option (-F), soit dans l'instance BEGIN (BEGIN{FS=<séparateur>}).

    Avec cette solution , est ce que c'est possible de parcourir toutes les lignes 2 à 2 du fichier ?
    c'est à dire ? comparer les lignes 1 et 2, 3 et 4, 5 et 6... ?

    le pseudo-code donné compare les lignes 1 et 2, 2 et 3, 3 et 4...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Oui c'est bien ça : comparer les lignes 1 et 2, 3 et 4, 5 et 6...

    ok pour le pseudo-code . Je m'y met et reposte la solution au plus vite .
    Merci encore

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    N BaH ,
    Comme je suis un peu à court de temps , j'aurai besoin de ton aide .
    j'ai un peu du mal avec awk vu que je ne connais pas très bien cet outil
    je te met un bout de code ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while read i; do
    echo $i
    line=$i
    awk -v ligne="$line" '{split ($ligne , a, ";"); print a[1] a[2] a[3] }'
    done < monfichier
    Comme résultat , Awk ne parcourt pas la première ligne , il split bien autres lignes .
    Faut -il tout mettre dans le awk ou faire du shell/awk ?

    Merci par avance pour ton retour !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    100% awk !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' '{if(FNR%2){ligne_i=$0}else{split(ligne_i,l_i,";"); print l_i[4]" =? 1 && "$4" =? 3"}}' tonFichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    j'ai modifié la ligne awk en integrant les autres conditions mais j'ai l'impression que ça ne marche pas . Le resultat n'est pas
    Voici la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F';' '{if(FNR%2){ligne_i=$0}else{split(ligne_i,l_i,";"); if ( l_i[5] "==" $5 && l_i[4] "== 1 && "$4"==3" && l_i[7] "==" $6 ) print l_i}}'
    Vois-tu des erreurs

    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    j'avais mis des guillemets pour l'affichage de l'exemple des tests, mais pour être pris en compte par awk, il faut les enlever.

    «ça ne marche» n'est pas très indicatif des erreurs qui s'affichent, ou d'un résultat non conforme à tes attentes
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Désolé , je n'ai aps été clair sans exemple

    extrait du fichier csv que j'ai en entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    6305642J;IU4;MT201403;1;IU4;2,44;2,44;0;correct
    6305688J;IU4;MT201403;1;IU4;2,44;2,44;0;correct
    6305691M;IU4;MT201403;1;IU4;5,57;5,57;0;correct
    6305718S;IU4;MT201403;1;IU4;2,44;2,44;0;correct
    6305740R;IU4;MT201403;1;IU4;2,44;2,44;0;correct
    6305794Z;IU4;MT201403;1;IU4;7,42;7,42;0;correct
    6305928V;IU4;MT201403;1;IU4;7,42;2,39;-5,03;correct sortant
    6305928V;IU4;MT201403;3;IU4;-5,02;2,39;7,41;correct sortant
    6305979A;IU4;MT201403;1;IU4;7,42;7,42;0;correct
    6306003B;IU4;MT201403;1;IU4;2,44;2,44;0;correct
    Voici la ligne de code avec awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F';' '{if(FNR%2){ligne_i=$0}else{split(ligne_i,l_i,";"); if ( l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $6 ) print l_i}}' monfichier > fichier
    normalement au vu des conditions ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    6305928V;IU4;MT201403;1;IU4;7,42;2,39;-5,03;correct sortant
    doit se trouver dans fichier .
    Je pense que j'ai des erreurs au niveau de mes conditions .
    J'espere avoiré été plus clair .

    Merci beaucoup pour ton aide !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    non, les conditions sont bonnes, c'est le fichier qui ne correspond pas : le champ #6 de la deuxième ligne «correct sortant» vaut -5,03, et non 2,39

    ce n'est pas le tableau qu'il faut afficher (les tableaux ne s'affichent d'ailleurs pas ainsi), mais la variable ligne_i.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Oups ! Oui c'est bien ça . j'ai remodifié le awk en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F';' '{if(FNR%2){ligne_i=$0}else{split(ligne_i,l_i,";"); if ( l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $7 ) print ligne_i}}' monfichier
    Seulement après analyse des résultats , il ne remonte que les lignes paires . Je pense t'avoir induit en erreur lors de la lecture du fichier .
    cela a t-il un lien avec le FNR ?
    en gros , au vu du fichier csv , il faut comparer les lignes 1 et 2 , 2 et 3 , ainsi de suite .
    Penses tu que c'est faisable en modifiant le FNR peut etre ?

    Désoléé pour ça

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    Citation Envoyé par demonblack
    Oui c'est bien ça : comparer les lignes 1 et 2, 3 et 4, 5 et 6...
    Citation Envoyé par demonblack
    au vu du fichier csv , il faut comparer les lignes 1 et 2 , 2 et 3 , ainsi de suite .

    alors, il faut reprendre le pseudo-code de mon premier message.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    J'ai pensé à un truc dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F';' '{if(FNR%2){ligne_i=$0}else{split(ligne_i,l_i,";"); if ( l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $7 ) print ligne_i ;else ligne_i=$1 }}' monfichier
    par rapport à ton pseudo_code : enregistrer la ligne courante dans la variable ligne_i ??

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    awk -F';' '{
       if(FNR==1){
          ligne_i=$0
       }else{
          n=split(ligne_i,l_i,";");
          if ( l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $6 )print ligne_i;
          ligne_i=$0
       }
    }'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Merci encore pour ta patience N BaH et de m'avoir montré ce super outil !

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Re -bonjour,
    Petite question

    Pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    awk -F';' 'BEGIN {OFS=";"} {if(FNR==1)
    {ligne_i=$0;}
    else{n=split(ligne_i,l_i,";");     
    if (l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $7)  
    print l_i[1] ,l_i[2] ,l_i[3] ,l_i[4] ,l_i[5] ,l_i[6] ,l_i[8] ,l_i[7] , l_i[9];     
    ligne_i=$0}}'
    monfichier > monfichiertraite
    Le Awk parcoure bien le fichier et me print les lignes qui vérifient les conditions . Par contre , comme je charge ce csv traité dans une base , est-il possible de traiter ses lignes à l'interieur du même fichier ou y'a t'il un moyen de récupérer les autres lignes non traitées dans le nouveau fichier traité ?
    Merci

  18. #18
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    pour les lignes non-traitées, pourquoi ne pas faire un simple "print" ?

    En ce qui concerne la modification du fichier source, c'est plutôt "non", à moins d'avoir un awk récent avec l'option qui va bien (-i il me semble).
    Mais comme tu sembles faire un script, tu peux passer par un fichier temporaire.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 5
    Points
    5
    Par défaut
    Bonjour ,
    J'ai essayé de faire un print des lignes non traités dans la fichier temporaire comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    awk -F';' 'BEGIN {OFS=";"} {if(FNR==1)
    {ligne_i=$0; print ligne_i }
    else{n=split(ligne_i,l_i,";");     
    if (l_i[5] == $5 && l_i[4] == 1 && $4 == 3 && l_i[7] == $7)  
    print l_i[1] ,l_i[2] ,l_i[3] ,l_i[4] ,l_i[5] ,l_i[6] ,l_i[8] ,l_i[7] , l_i[9];     
    ligne_i=$0}}'
    monfichier > monfichiertraite
    mais les lignes non traitées ne se trouvent pas dans mon fichier temporaire .
    Probleme de syntaxe ?

    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    problème de syntaxe ?
    problème de condition : ne s'affichent que les lignes qui remplissent les conditions énoncées.
    il faut sortir le print de la condition, ou en ajouter un en dehors de la condition.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Saut de ligne dans fichier CSV
    Par pausg dans le forum Langage
    Réponses: 15
    Dernier message: 29/07/2011, 16h27
  2. Réponses: 18
    Dernier message: 24/06/2011, 15h13
  3. [AC-2000] Suppression lignes sur fichier CSV depuis Access
    Par electronedf dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/10/2010, 13h35
  4. Compter les lignes du fichier CSV
    Par miniRoshan dans le forum Général Java
    Réponses: 5
    Dernier message: 28/05/2010, 11h37
  5. [CSV] Traitement d'un gros fichier CSV
    Par Adrinou dans le forum Langage
    Réponses: 6
    Dernier message: 09/10/2007, 12h40

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