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

Programmation et administration système Perl Discussion :

Regrouper valeur répeter


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut Regrouper valeur répeter
    Bonjour,

    J'ai un fichier comme suit :
    8921301415753523385|KEY|7110452091
    8921301415753523385|LASTNAME|Abik
    8921301415753523385|FIRSTNAME|mehamed
    8921301415753523385|BIRTHDATE|19821029
    8921301415753523385|IDTYPE|pc
    8921301415753523385|IDNUMBER|12345
    8921301415753523385|ADDRESS|cite zahaf 250n08 djelfa
    8921301415753523385|WILAYA|17
    8921301415763133720|KEY|7120338689
    8921301415763133720|LASTNAME|Amrou
    8921301415763133720|FIRSTNAME|abdedjabar
    8921301415763133720|BIRTHDATE|19920610
    8921301415763133720|IDTYPE|Pc
    8921301415763133720|IDNUMBER|23456
    8921301415763133720|ADDRESS|msila
    8921301415763133720|WILAYA|28

    Si vous avez remarquer, le premier champs contient des valeurs qui se répètent, et j'aimerai bien les regrouper en une seule ligne
    Je cherche a avoir le résultat :
    8921301415753523385|KEY|7110452091|LASTNAME|Abik|FIRSTNAME|mehamed|BIRTHDATE|19821029|IDTYPE|pc|IDNUMBER|12345|ADDRESS|cite zahaf 250n08 djelfa|WILAYA|17
    8921301415763133720|KEY|7120338689|LASTNAME|Amrou|FIRSTNAME|abdedjabar|BIRTHDATE|19920610|IDTYPE|Pc|IDNUMBER|23456|ADDRESS|msila|WILAYA|28

    J'ai tenté avec le script (qui ne marche pas) :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #!/usr/bin/perl
     
     
    use strict;
     
    sub usage () {
                         print STDERR "\nUsage : $0 fichier.txt file-ICCID \n";
                         exit(1);
                       }
     
     
    my $FicResult = "result.txt";
    open(SORTIE, "> $FicResult") or die("Erreur lors de la creation du fichier $FicResult : $!\n");
     
    open ICCID, "< $ARGV[1]" or die "Can't open file $ARGV[0]: $!";
    open MarkOUT, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
     
    my @MarkOUTLine;
    my @tab1;
    my @tab2;
    my @tab3;
    my @tab4;
    my @tab5;
    my @tab6;
    my @tab7;
    my @tab8;
    my %SDPHash;
    my $variccid;
    my $list;
     
     
    while ( <ICCID> )
    {
     
        chomp;
    	$variccid = $_;
    	while (<MarkOUT>) {
     
    	@MarkOUTLine = split(/|/, $list);
    	if ( exists $SDPHash { $MarkOUTLine[0] } )
                {
    	        @tab1 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab2 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab3 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab4 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab5 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab6 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab7 = {$MarkOUTLine[1],$MarkOUTLine[2]};
    			@tab8 = {$MarkOUTLine[1],$MarkOUTLine[2]};
     
    			print SORTIE "$MarkOUTLine[0],$tab1[0],$tab1[1],$tab2[0],$tab2[1],$tab3[0],$tab4[1], $tab5[0],$tab6[1],$tab7[0],$tab7[1],$tab8[0],$tab8[1]\n";
     
    			}
    	}
    }
     
     
    close (MarkOUT); 
    close (SORTIE);
    close (ICCID);

    Pouvez vous SVP m'aidez sur la solution, je sais qu'il faut utiliser les hash, mais j'ai des difficultés a utiliser les hash.

    Merci.

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    tout d'abord, utilise la balise code (le bouton #) pour afficher ton code, cela sera plus lisible.

    Ensuite il te faut effectivement un hash de listes, avec ta première valeur comme clé, pour rassembler tes valeurs

    quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %data;
    ...
    while (<MarkOUT>) {
       my @MarkOUTLine = split(/\|/, $list);
       push @{$data{$MarkOUTLine[0]}}, ($MarkOUTLine[1], $MarkOUTLine[2]);
    }
    ne pas oublier d'échapper le |

    ensuite tu les affiches sur une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach my $key (keys %data) {
       print SORTIE join("|",@{$data{$key}}),"\n";
    }
    Hope this helps !
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Merci pour votre réponse, le script devient donc :

    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
     
    #!/usr/bin/perl
     
    # Ce Script fait le découpage par lignes d'un grand fichier en plusieurs fichiers en petit morceaux
     
    use strict;
     
    sub usage () {
                         print STDERR "\nUsage : $0 fichier.txt \n";
                         exit(1);
                       }
     
     
    my $FicResult = "result.txt";
    open(SORTIE, "> $FicResult") or die("Erreur lors de la creation du fichier $FicResult : $!\n");
     
    #open ICCID, "< $ARGV[1]" or die "Can't open file $ARGV[0]: $!";
    open MarkOUT, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
     
     
     
    my %data;
    my $list;
     
    while (<MarkOUT>) {
       my @MarkOUTLine = split(/\|/, $list);
       push @{$data{$MarkOUTLine[0]}}, ($MarkOUTLine[1], $MarkOUTLine[2]);
    }
     
     
    foreach my $key (keys %data) {
       print SORTIE join("|",@{$data{$key}}),"\n";
    }
     
    close (MarkOUT); 
    close (SORTIE);
    Mais le résultat est que des :

    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    J'ai pu rectifier le script que vous m'avez partager Mr Gardyen, et ça marche, merci bcp ,

    Voire ci-dessous :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    #!/usr/bin/perl
     
     
     
    use strict;
     
    sub usage () {
                         print STDERR "\nUsage : $0 fichier.txt \n";
                         exit(1);
                       }
     
    if  (scalar @ARGV != 1)
                  {
                   print STDERR "Error: this script need 1 argument\n";
                   usage();
                  }
     
    my $file = $ARGV[0];
    if ( ! -s $file )      
                  {
    	           print STDERR "Error: file '$file' doesn't exist or has a 0 size\n";
    	           usage();
                  }
     
    if ( ! -r $file )      
                  {
    	           print STDERR "Error: file '$file' can't be read\n";
    	           usage();
                  }   
    if ( -B $file )       
                  {
    	           print STDERR "Error: file '$file' is a binary file. \n";
    	           usage();
                  }
     
    my $FicResult = "result.txt";
    open(SORTIE, "> $FicResult") or die("Erreur lors de la creation du fichier $FicResult : $!\n");
    open MarkOUT, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
     
     
     
    my %data;
     
    while (<MarkOUT>) {
    chomp;
       my @MarkOUTLine = split(/\|/, $_);
       push @{$data{$MarkOUTLine[0]}}, ($MarkOUTLine[1], $MarkOUTLine[2]);
    }
     
     
    foreach my $key (keys %data) {
          print SORTIE $key."|".join("|",@{$data{$key}}),"\n";
    }
     
    close (MarkOUT);
    close (SORTIE);

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    juste une petite remarque n'ayant pas de rapport direct avec ta question.

    Tu utilises la syntaxe suivante:
    Ne mets pas de paires de parenthèses vides dans la définition, c'est une mauvaise idée; contente-toi de:

    Les parenthèses crée un prototype pour ta fonction; ce n'est sans doute pas ton objectif, et tu ne devrais pas essayer de le faire à moins d'avoir une vraie bonne raison et de savoir réellement ce que tu fais.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Bonjour Lolo78,


    C'est noté, merci

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

Discussions similaires

  1. [2008R2] Regrouper valeurs d'une colonne
    Par miikado dans le forum Développement
    Réponses: 3
    Dernier message: 19/03/2014, 11h15
  2. [XL-2003] regroupement valeur dans TCD via VBA
    Par yanou91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/02/2013, 15h34
  3. [XL-2003] Regrouper valeur sur un onglet
    Par lili189 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/09/2012, 14h14
  4. fonction regroupant valeurs consécutives ?
    Par recherche888 dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/03/2012, 15h07
  5. Regrouper valeurs dans un select
    Par Nesta92 dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 18/01/2012, 14h44

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