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