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 :

Extraction de données d'un .csv en bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Futur administrateur systèmes
    Inscrit en
    Décembre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Futur administrateur systèmes

    Informations forums :
    Inscription : Décembre 2010
    Messages : 57
    Par défaut Extraction de données d'un .csv en bash
    Bonjour !


    Bon, je préviens, j'annonce un gros pavé pour expliquer mon problème ! Je vais essayer de détailler le plus possible les commandes que j'utilise !


    J’ai un petit soucis avec le fait d’extraire des données de plusieurs fichiers .csv en bash :

    J’ai deux fichiers csv, un pour le mois de novembre et un autre pour le mois de décembre. Les deux ont 15 colonnes, mais l’un est composé de 5200 lignes et l’autre de 5204 lignes. Les noms des colonnes sont les mêmes dans les deux fichiers et tout est classé de la même manière.
    On me demande de comparer les résultats de la colonne “O” des deux fichiers et deux trouver le nom des volumes qui ont disparus et ceux qui sont apparus entre temps. Voilà où j’en suis :


    Pour faire la différence entre les deux colonnes, j’extrait d’abord la colonne qui m’intéresse des deux fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cut -d’,’ -f15 fichierNovembre.csv > fichier1.csv
    cut -d’,’ -f15 fichierDecembre.csv > fichier2.csv
    Ainsi, j’ai deux fichiers csv avec les colonnes qui m’intéressent. Il me reste plus qu’à les soustraires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk{getline t<”fichierNovembre.csv”; print $0-t}’ fichierDecembre.sv > fichier3.csv
    J’obtiens bien un troisième .csv avec la différence des deux colonnes. Le problème, c’est que je perds l’en-tête avec le nom de la colonne. Il est remplacé par un 0. Donc je suis obligé de supprimer la ligne avec le 0 et d’ajouter l’en-tête manuellement avec la commande sed, ce n’est pas pratique.


    Ensuite, pour voir les volumes qui sont apparus entre temps et ceux qui ont disparus, je fais la même chose, j’extrais des fichiers la colonne avec le nom des volumes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cut -d’,’ -f2 fichierNovembre.csv > fichier4.csv
    cut -d’,’ -f2 fichierDecembre.csv > fichier5.csv
    Puis je fais la différence entre les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diff -u fichier4.csv fichier5.csv > fichier6.csv

    Dans ce .csv, les fichiers disparus sont représentés par les “-” et ceux qui sont apparus par des “+”. Il y a aussi des “@” qui sont apparus mais je ne sais pas à quoi ils servent. Je décide donc de faire deux fichiers, un qu’avec les “-” et un autre qu’avec les “+” tout en supprimant les “@” :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grep ‘-’ fichier6.csv > fichier7.csv
    grep ‘+’ fichier6.csv > fichier8.csv
    grep -v@’ fichier7.csv > fichier9.csv
    grep -v@’ fichier8.csv > fichier10.csv
    De ce fait, j’obtiens trois .csv :

    Celui avec la différence entre les volumes > fichier3.csv
    Celui avec les volumes qui ont disparus > fichier9.csv
    Celui avec les volumes qui ont apparus > fichier10.csv

    Mais je dois également ajouter deux fichiers en plus : un qu’on nommera fichier11.csv , celui avec la référence des volumes, histoire que je puisse savoir à quel volume appartient tel chiffre de la colonne “O” extrait dans le fichier3.csv, une fois face à face, et un autre avec le nom des volumes, qu’on nommera fichier12.csv ( je ne sais pas si c’est très clair… ). Donc au total, j’ai 5 fichier.csv


    On est d’accord que ce n’est pas pratique, mais ce sont les premières commandes qui me sont venues. J’ai tout “ automatisé ” en insérant ces commandes dans un script. J’ai juste à donner les deux fichiers à traiter en paramètres et tout ce fait automatiquement.

    Le problème maintenant, c’est que je dois rendre le tout dans un seul fichier csv, pour celà, j’utilise la commande diff -y :

    Je fusionne le fichier avec la référence et le nom des volumes entre eux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diff -y fichier11.csv fichier12.csv > fichier13.csv

    Le problème avec cette commande c’est que la colonne qui est dans le fichier11.csv et celle qui est dans le fichier13.csv sont séparés par 6 colonnes. Elles ne sont pas côte à côte. Et en plus de ça, il y a une colonne qu’avec des pipes juste avant la colonne 6. Mais admettons que ce n’est pas trop grave.


    Il faut ensuite que je fusionne ce fichier contenant la référence et le nom des colonnes avec la colonnes que j’ai extrais pour faire la différence entre les volumes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diff -y fichier13.csv fichier3.csv > fichier14.csv

    Je devrais avoir 3 colonnes dans mon fichier14.csv, j’en ai que deux car la colonne du fichier3.csv a remplacé la deuxième colonne du fichier14.csv au lieu de se mettre à la suite…



    Auriez-vous une solution pour fusionner mes fichier csv en un seul fichier ?



    Merci d’avance !

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Cas typique de réalisation avant la conception ! (Et peut-être même avant les spécifications ... voire le cahier des charges )
    Tu peux empiler des milliers de lignes de code inutiles avec cette méthode.
    Te rends-tu compte que, dans tout ce message indigeste, tu n'as même pas exprimer d'objectif ?

    Un awk après un cut, et on comprend le ridicule de l'affaire.
    Empiler des cut, des awk, des grep, etc n'est pas la bonne méthode.

    Quel est le vrai but ?
    Donne un exemple concret de sortie souhaitée.

  3. #3
    Membre actif
    Profil pro
    Futur administrateur systèmes
    Inscrit en
    Décembre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Futur administrateur systèmes

    Informations forums :
    Inscription : Décembre 2010
    Messages : 57
    Par défaut
    Merci pour ta réponse !


    Le but ici est de :

    • Rapporter la différence entre chaque volume. (Colonne 'O' des fichiers.csv)
    • Identifier les nouveau volumes
    • Identifier les volumes supprimés



    Ces informations doivent ensuite être mise dans un fichier.csv de ce type :


    NomDesController NomDesVolumes VolumeUtilisé(MB) VolumesSupprimés VolumesAjoutés
    Controller1 Volumemachin 9999 Volumetruc VolumeBidule
    Controller2 Volumetoto 3333 Volumemichel VolumePierre


    Voilà le résultat que j'aimerais obtenir !

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Rapporter la différence entre chaque volume.
    Donc 5 000 volumes donneront 12 497 500 comparaisons ?

    Ces informations doivent ensuite être mise dans un fichier.csv de ce type :
    As-tu compris que l'habitude est de traiter les fichiers ligne à ligne ?
    Donc mélanger les informations par colonne n'est pas bon.
    "VolumeMachin" n'a aucun rapport avec "Volumetruc", alors qu'ils sont sur la même ligne, dans ton exemple.

    Mettre en ligne les colonnes serait moins mauvais.
    Faire des listes dans des fichiers séparés serait même bon.

  5. #5
    Membre actif
    Profil pro
    Futur administrateur systèmes
    Inscrit en
    Décembre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Futur administrateur systèmes

    Informations forums :
    Inscription : Décembre 2010
    Messages : 57
    Par défaut
    Je pense que je me suis mal exprimé !

    Citation Envoyé par Flodelarab Voir le message
    Donc 5 000 volumes donneront 12 497 500 comparaisons ?

    Non, 5000 volumes donneront 5000 comparaisons.
    Ce sont les mêmes volumes dans les deux fichiers. Ce que je veux, pas exemple, c'est que le volume qui occupe la ligne 2 du tableau du mois de novembre soit comparé à lui même, mais dans le tableau du mois de décembre. Donc il faudrait comparer la ligne 2 du tableau de Novembre à la ligne 2 du tableau de Décembre. Le problème c'est que les tableaux sont composés de 18 colonnes et je n'ai pas besoin de toutes les colonnes. D'où l'idée d'extraire la colonne qui m'intéresse des deux fichiers .csv pour ensuite les comparer et mettre le résultats dans un troisième fichier.


    Citation Envoyé par Flodelarab Voir le message
    As-tu compris que l'habitude est de traiter les fichiers ligne à ligne ?
    Donc mélanger les informations par colonne n'est pas bon.
    "VolumeMachin" n'a aucun rapport avec "Volumetruc", alors qu'ils sont sur la même ligne, dans ton exemple.
    Du coup c'est juste un problème de présentation dans mon fichier ?
    Mise à part les volumes supprimés et ceux ajoutés, les trois autres colonnes ont bien un rapport entre elles. Mais disons que ce serait un fichier " Compte rendu " et qu'il faudrait que toutes ces informations y soient. Donc a la limite il faudrait juste pour que ce soit plus " clair " que les colonnes volumes supprimés et volumes ajoutés soient en dessous des autres colonnes, histoire qu'on ne confonde pas.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Bonjour,

    quand on doit traiter des champs/colonnes on utilise awk, au minimum.
    tu peux "prototyper" en bash, mais ce sera toujours plus rapidement traité en awk.

    donc, tout faire en awk, directement, après avoir élaboré un algorithme des traitements à effectuer.

    moi, sans exemples représentatifs (lignes normales, exceptions...) des fichiers à traiter, et sans sortie correspondante attendue, je ne bouge pas un neurone.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Extraction de donnée sur TALEND de MongoDB vers XML ou CSV
    Par djtrp dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/03/2014, 15h41
  2. [2005] Extraction de données depuis un fichier CSV
    Par alaabed dans le forum SSIS
    Réponses: 3
    Dernier message: 22/04/2011, 14h07
  3. Extraction de données d'un fichier csv
    Par freyr dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/11/2010, 09h08
  4. Script extraction données dans fichier CSV
    Par nollier dans le forum VBScript
    Réponses: 18
    Dernier message: 20/06/2008, 09h32
  5. [Débutant] Extraction de données en CSV ?
    Par ghohm dans le forum SQL
    Réponses: 23
    Dernier message: 21/12/2007, 16h28

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