4 Stimmen

Perl - Daten in Datei zusammenfassen

Wie lassen sich Daten aus einer Datei mit etwa 2 Millionen Datensätzen am besten in Perl zusammenfassen?

Zum Beispiel: Eine Datei wie diese,

ABC|XYZ|DEF|EGH|100

ABC|XYZ|DEF|FGH|200

SDF|GHT|WWW|RTY|1000

SDF|GHT|WWW|TYU|2000

Die ersten 3 Spalten müssen wie folgt zusammengefasst werden,

ABC|XYZ|DEF|300

SDF|GHT|WWW|3000

Chris

3voto

Platinum Azure Punkte 43334

Angenommen, es gibt immer fünf Spalten, von denen die fünfte numerisch ist, und Sie wollen immer, dass die ersten drei Spalten der Schlüssel sind...

use warnings;
use strict;

my %totals_hash;

while (<>)
{
  chomp;
  my @cols = split /\|/;

  my $key = join '|', @cols[0..2];

  $totals_hash{$key} += $cols[4];
}

foreach (sort keys %totals_hash)
{
  print $_, '|', $totals_hash{$_}, "\n";
}

2voto

codaddict Punkte 426877

Sie können eine Raute als verwenden:

my %hash;
while (<DATA>) {
        chomp;
        my @tmp = split/\|/;     # split each line on |
        my $value = pop @tmp;    # last ele is the value
        pop @tmp;                # pop unwanted entry
        my $key = join '|',@tmp; # join the remaining ele to form key

        $hash{$key} += $value;   # add value for this key
}

# print hash key-values.
for(sort keys %hash) {
        print $_ . '|'.$hash{$_}."\n";
}

Ideone Link

0voto

sorpigal Punkte 24323

Vorausgesetzt, Ihre Eingabedatei hat ihre Datensätze in separaten Zeilen.

perl -n -e 'chomp;@a=split/\|/;$h{join"|",splice@a,0,3}+=pop@a;END{print map{"$_: $h{$_}\n"}keys%h}' < inputfile

0voto

Axeman Punkte 29362

1-2-3-4 Ich erkläre EIN CODE-GOLF-KRIEG!!! (Okay, ein einigermaßen lesbar Code-Golf-Störung).

my %sums;
m/([^|]+\|[^|]+\|[^|]+).*?\|(\d+)/ and $sums{ $1 } += $2 while <>;
print join( "\n", ( map { "$_|$sums{$_}" } sort keys %sums ), '' );

-1voto

tschubring Punkte 14

Sortieren, um alle Datensätze mit den gleichen ersten 3 Tripletts nebeneinander zu stellen. Iterieren Sie und geben Sie eine Zwischensumme aus, wenn ein anderer Satz von Tripletts erscheint.

$prevKey="";
$subtotal=0;
open(INPUTFILE, "<$inFile");
@lines=<INPUTFILE>;
close (INPUTFILE);
open(OUTFILE, ">$outFile");
@sorted=sort(@lines);
foreach $line(@lines){
    @parts=split(/\|/g, $line);
    $value=pop(@parts);
    $value-=0; #coerce string to a number
    $key=$parts[0]."|".$parts[1]."|".$parts[2];
    if($key ne $prevKey){
        print OUTFILE "$prevKey|$subtotal\n";
        $prevKey=$key;
        $subtotal=0;
        }
    $subtotal+=$value;
    }
close(OUTFILE);

Wenn die Sortierung von 2 Millionen Ihre Box erdrückt, müssen Sie möglicherweise jeden Datensatz in eine Datei auf der Grundlage der Gruppe einfügen und dann die Zwischensumme für jede Datei bilden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X