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

Linux Discussion :

données avec séparateurs


Sujet :

Linux

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Par défaut données avec séparateurs
    Bonjour à tous !

    Je vous sollicite beaucoup aujourd'hui ! Mais c'est lundi ! Dur dur !

    Je m'explique, j'ai un fichier texte dans lequel j'ai une série de nom sur la première ligne et une autre série sur la deuxième ligne tous séparés par |

    nom|prénom|....|age|fgdfg|dgfd|....
    Durand|Eric|...|58|fdgd|....

    La première ligne étant en relation avec l'autre.

    Comment récupérer l'age par exemple ? Je tente le grep sur "age" mais ensuite ??

    Merci à tous d'avance

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    awk est assez performant pour ce genre de truc.
    Avec le fichier
    Code titi.txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom|prénom|....|age|fgdfg|dgfd|....
    Durand|Eric|...|58|fdgd|....
    je veux la 4eme colonne de chaque ligne, le field-separator (FS) etant le pipe | :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk 'BEGIN { FS = "|" } ; { print $4 }' titi.txt
    me donne bien
    age
    58
    Evidemment, on peut analyser la premiere ligne (les entetes de colonnes) pour trouver le numero de la colonne nommee "age" et rendre le processus un peu plus flexible.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Par défaut
    c'est bien ce que je veux faire...!

    Car l'age n'est pas forcément à la 4ieme colonne et je peux rajouter des composant avec l'age qui serait du même coup déplacé d'une ou plusieurs colonne ... Je cherche mais tu me mets sur la voie. Je te remercie.

    Si tu as d'autres idées je suis preneur. Merci

    Coincoin22

  4. #4
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Sinon tu peux aussi utiliser cut -d '|' -f <x>, ou x est le numero de ta colonne. Avec une premiere boucle pour trouver la colonne en question...

  5. #5
    Membre émérite 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
    Par défaut
    Citation Envoyé par coincoin22
    nom|prénom|....|age|fgdfg|dgfd|....
    Durand|Eric|...|58|fdgd|....
    Dupond|lea|...|21|fdgd|....
    dubreuil|lio|...|18|fdgd|....

    La première ligne étant en relation avec l'autre.
    Comment récupérer l'age par exemple ?
    Script avec un paramétrage :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Cle=nom		#-- argument de recherche, le nom
    CleVal=Dupond	#-- nom de la personne
     
    Info=age	#-- information demandée, l'age
     
    awk -F"|" -v Cle=$Cle -v CleVal=$CleVal -v Info=$Info '
    {
    	#-- Traitement enreg. n° 1
    	if (NR == 1) {
    		for (Col=1;Col <=NF;Col++) {
    			if ($Col==Cle) {
    				print "* champ \""Cle"\" trouvé en colonne "Col
    				ColCle=Col
    				continue
    			}
    			if ($Col==Info) {
    				print "* champ \""Info"\" trouvé en colonne "Col
    				ColInfo=Col
    				continue
    			}
    		}
    		if (ColCle!=0 && ColInfo!=0) {
    			next
    		}
    		if (ColCle==0) {
    			print "*** Cle : \""Cle"\" non trouvée dans ligne de titre"
    		}
    		if (ColInfo==0) {
    			print "*** Info : \""Info"\" non trouvée dans ligne de titre"
    		}
    		exit 1
    	}
    	#-- FIN Traitement enreg. n° 1
     
    	if ($ColCle==CleVal) {
    		TopCleVal=1
    		print "+ "Cle" : "$ColCle", "Info" : "$ColInfo
    	}
    }
    END {
    	if (ColCle==0 || ColInfo==0) {
    		exit 1
    	}
    	if (TopCleVal!=1) {
    		print "*** Pas de "Cle" : "CleVal" dans le fichier !!!"
    	}
    }' test

    Resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    * champ "nom" trouvé en colonne 1
    * champ "age" trouvé en colonne 4
    + nom : Dupond, age : 21

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Perl est plus performant que Awk, et plus flexible, sauf quand on connait déjà awk ou qu'on anticipe de devoir utiliser une machine antédiluvienne (Perl est disponible et installé sur la plupart des Unix/Linux maintenant, et facilement installable sous Windows).
    Code Perl : 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
    #!/usr/bin/perl
    use strict; use warnings;
    my ($searchfield, $searchval, $fieldname) = (shift, shift, shift);
     
    chomp( my $fields = <> );
    my @fields = split /\|/, $fields;
    my %fieldsnum; @fieldsnum{@fields} = (0..$#fields);
     
    while( <> ) {
      chomp;
      my @vals = split /\|/;
      if( $vals[$fieldsnum{$searchfield}] eq $searchval ) {
        print "$searchfield : $searchval, "
          . "$fieldname : $vals[$fieldsnum{$fieldname}].\n";
        last;
      }
    }

    --
    Jedaï

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/03/2012, 09h26
  2. meilleure base de données avec java
    Par mial dans le forum JDBC
    Réponses: 11
    Dernier message: 10/11/2010, 11h49
  3. Modifier le nom d'une base de donnée avec erreur sy
    Par mmn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2003, 10h12
  4. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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