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 :

Problème d'extraction de données d'un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Par défaut Problème d'extraction de données d'un fichier
    Bonjour tout le monde,

    Je me tourne vers vous car je rencontre un problème assez embêtant.

    Pour planter le décor je ne suis pas un expert en bash mais j'essaie tout de même de comprendre et d'apprendre. Par contre je dois admettre que j'ai beaucoup de mal avec les commandes grep et sed. Je n'arrive jamais a trouver les bons arguments pour faire ce que je souhaite faire.

    J'ai passé ces deux derniers jours à parcourir le net pour comprendre et trouver des solutions à mon problème mais impossible.

    Concernant mon problème j'ai deux fichiers différents dont je veux extraire des information précises. Les deux fichiers ressemble à ça :

    gamer.txt


    Running command 'rconcmd' for instance 'TheIsland'
    "
    0. [GdK] Inity, 76561198029054012
    1. Jean Claude, 75475434525234523
    2. Ludovic, 324654665765867567
    "


    Dans ce fichier les deux premières lignes et la dernière ne m'intéresse pas du tout (ligne 1 : Running command 'rconcmd' for instance 'TheIsland' et ligne 2 : "). Ce qui m’intéresse dans chaque ligne c'est (en prenant exemple sur la ligne 3) le pseudo : [GdK] Inity et l'id : 76561198029054012. Chacune de ces deux valeurs devra être injecté dans une variable.

    Mon script pour ceci ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read lnid; do
    		ligneid=`echo $lnid | sed 's/\"//g'`
    		temppseudo=`echo $ligneid | sed -n 's/.*(\..*\),.*/\1/p'`
    		tempid=`echo $ligneid | egrep -o '[[:digit:]]*'`
    done < gamer.txt
    Malheureusement pour l'id egrep -o '[[:digit:]]* me retourne tous les chiffres de la ligne , mais je n'ai que besoin de la deuxième suite de chiffre sans le chiffre en début de ligne. Comment faire ?

    chat.txt


    Running command 'rconcmd' for instance 'TheIsland'
    "
    [GdK] Inity (Inity): le message envoyé par l'utilisateur dans le chat
    Mario76 (Jean Claude): Je suis un noob
    Alexdu93 (Ludovic): Kevin qui Rox du poney
    "


    Dans ce fichier les deux premières lignes et la dernière ne m'intéresse pas du tout (ligne 1 : Running command 'rconcmd' for instance 'TheIsland' et ligne 2 : "). Ce qui m’intéresse dans chaque ligne c'est (en prenant exemple sur la ligne 3) le pseudo : [GdK] Inity id : Inity et le message : le message envoyé par l'utilisateur dans le chat. Chacune de ces deux valeurs devra être injecté dans une variable.

    Mon script actuellement ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read ln; do
    		ligne=`echo $ln | sed 's/\"//g'`
                    pseudoIG=`echo $ligne | sed -n 's/.*(\(.*\)).*/\1/p'`
    		message=`echo $ligne | sed 's/.*\(: .*\)/\1/'`
    		pseudoST=`echo $ligne | sed 's/ *(.*//'`
    done < chat.txt
    Et cela semble bien fonctionner ... mais peut-être vous avez une idée plus rapide et plus simple.

    Voilà je vous remercie d'avance pour votre aide.

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

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

    je te recommande d'utiliser, de préférence, awk pour ce type de fichier, qui, finalement, peut être résumé à une table de BDD (si l'on omet les deux premières et la dernière lignes (ce que peut faire gawk))

    bon, on peut le faire en 100% bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ rgx='^"'
    $ while read line; do if ((++n>1)) && [[ ! $line =~ $rgx ]]; then IFS=',.' read id username userID <<<"$line"; printf '%s\n' "$id" "${username/# /}" "${userID/# /}"; fi; done <gamer.txt
    0
    [GdK] Inity
    76561198029054012
    1
    Jean Claude
    75475434525234523
    2
    Ludovic
    324654665765867567 fichier.txt
    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
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Par défaut
    Woaouh,

    merci pour ton scripte N_BaH. Je viens de le tester et ca marche très bien. Par contre je n'arrive pas a comprendre son fonctionnement. Je l'ai décomposé en plusieurs lignes, te serais-t-il possible de m'expliquer la boucle if s'il te plait ?

    Je voudrais appliquer la même chose à gamer.txt

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    entre parenthèses, il y a une évaluation arithmétique, et
    les crochets doubles initient un test amélioré, avec un opérateur de comparaison de regex.
    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
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Par défaut
    Quels sont les patterns utilisés pour séparer les différents éléments ?

    Est-ce ?

    ou

    Désolé pour la question stupide mais je veux vraiment comprendre ? Et si c'est la deuxième proposition pourquoi les patterns sont dans le sens inverses ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    c'est l'IFS (Internal Field Separator), qui considère tous les caractères indiqués comme autant de séparateurs potentiels.

    la regex, elle, "recherche" les lignes qui commencent par ".
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  2. Perl: Extraction de données d'un fichier texte ?
    Par fifto dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 16h01
  3. [VB]extraction de données d'un fichier
    Par latevi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/01/2006, 12h03
  4. Extraction de donnés dans un fichier XML
    Par ANISSS dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 27/01/2006, 13h16
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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