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

Langage Perl Discussion :

Agrégation, Regroupement de lignes identiques dans un même fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut Agrégation, Regroupement de lignes identiques dans un même fichier
    Bonjour,

    Je souhaite agréger (regourper) les lignes ayant des valeurs identiques
    - Sur les champs 6, 7, 8
    - Puis réaliser la Somme sur le champ 24
    - Sur une volumétrie de lignes > 1 Millions

    J'ai essayé quelque chose, mais ça ne fonctionne pas. Le split semble bien fonctionner, mais aucun regroupement n'est fait

    Le fichier d'entrée (fichier TEXT de longueur fixe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    57  55  3 4290281  508  101  209  202  0  10001  7  629 102 0 24   25 3455    0   0  0 1782   0  0     0   1200    AUG 31 2012 11:41AM
    57  55  3 4261131  508  101  209  202  0  10000  7  629 102 0 24   25 2574    0   0  0 7777   0  50679 0   4934    AUG 31 2012 11:41AM
    57  55  3 4642611  508  101  209  201  0  10000  7  629 102 0 24   25 3455    0   0  0 8924   0  50677 0   400     AUG 31 2012 11:41AM
    57  55  3 4991920  508  100  209  202  0  10001  7  629 102 0 24   25 5811    0   0  0 2896   0  0     0   10266   AUG 31 2012 11:41AM
    Mon Code
    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
    use strict;
    use warnings;
    use Tie::File;
     
    my (@file, @result);
    open(IN, "test.txt") || die "E/S : $!";
    while(<IN>){
            my $tmp = substr($_, 3);
            push(@file, $tmp);
    }
    while(@file){
            my $line = $file[0];
            my @line= split (/\s+/,$line);
            my $somme_montant = $line[24];
            shift(@file);
            my $i = 0;
            foreach (@file){
                    if($_ =~ /$line[5] $line[6] $line[7](\d+)/){
                            $somme_montant = $somme_montant + $1;
                            splice(@file, $i, 1);
                    }
            $i++
            }
            my $newLine = "$line[5] $line[6] $line[7] $somme_montant $i";
            push(@result, $newLine);
    }
     
    close(IN);
     
    open(OUT, ">out") || die "E/S : $!";
    foreach (@result){
                    print OUT $_."\n";
    }
    close(OUT);
    Le résultat que ça me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    101 209 202 1200 3 
    101 209 202 4934 2 
    101 209 201 400 1  
    100 209 202 10266 0
    En Perl v5.10.1, sur SunOS
    A l'aide

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

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    est-ce que ton fichier est ordonné (= les lignes avec les mêmes champ 5 6 7 sont toutes les unes à la suite des autres) ? ou bien alors ces lignes peuvent être trouvées n'importe où dans le fichier ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Non, le fichier n'est pas ordonné sur les champs 5 6 7.
    On peut les trouver n'importe où dans le fichier

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

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    tiens voilà un premier script pas trop optimisé (ni très beau ), dis-moi ce que tu en penses
    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
    open(IN, "data.txt");
    my %all;
    while (<IN>) {
    	my @line = split /\s+/;
    	$all{$line[5]}{$line[6]}{$line[7]} += $line[24];
    }
    close(IN);
     
    foreach my $a (keys %all) {
     
    	foreach my $b (keys %{$all{$a}}) {
     
    		foreach my $c (keys %{$all{$a}{$b}}) {
    			my $montant = $all{$a}{$b}{$c};
    			print "$a $b $c $montant\n";
    		}
    	}
    }
    ce qui me donne sur ton fichier d'exemple:
    101 209 201 400
    101 209 202 6134
    100 209 202 10266
    juste une question, que représente ton $i ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Merci pour ton post Gardyen

    Je viens d'essayer ton pl

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Tie::File;
    use utf8;
    open(IN, "data.txt");
    my %all;
    while (<IN>) {
    	my @line = split /\s+/;
    	$all{$line[5]}{$line[6]}{$line[7]} += $line[24];
    }
    close(IN);
     
    foreach my $a (keys %all) {
     
    	foreach my $b (keys %{$all{$a}}) {
     
    		foreach my $c (keys %{$all{$a}{$b}}) {
    			my $montant = $all{$a}{$b}{$c};
    			print "$a $b $c $montant\n";
    		}
    	}
    }
    Mais il sort en KO avec le message suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unrecognized character \xC2; marked by <-- HERE after <-- HERE near column 1 at agregation.pl line 14.
    Je vais essayer de regarder pourquoi, mais ça semble un problème de jeu de caractères. j'ai essayé de forcer l'utf8, mais pareil
    Si tu as une idée je suis preneur

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    J'allais oublier, pour répondre à ta question "$i", c'était pour remonter le nombre de lignes identiques

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

Discussions similaires

  1. [Free Pascal] Détecter les lignes identiques dans deux tableaux de texte
    Par jeanmich dans le forum Free Pascal
    Réponses: 11
    Dernier message: 10/01/2009, 15h43
  2. Réponses: 8
    Dernier message: 28/12/2008, 17h08
  3. ligne identique dans une requête
    Par Soncar dans le forum VB.NET
    Réponses: 2
    Dernier message: 13/10/2008, 16h44
  4. Deux champs identiques dans la même table
    Par amne26 dans le forum Modélisation
    Réponses: 2
    Dernier message: 22/09/2008, 20h29
  5. Supprimer lignes identiques dans un fichier
    Par Gad29 dans le forum Langage
    Réponses: 19
    Dernier message: 30/05/2007, 15h09

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