Thread 80 Mio Zeilen einlesen (24 answers)
Opened by FanClub at 2013-07-16 10:17

renee
 2013-07-16 11:17
#168892 #168892
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Woran machst Du fest, dass ein Block mehrmals vorkommt? Nur die Produktnummer oder auch die Details?

Ich würde für so eine Datei einen XML-Parser nehmen, der für große Dateien geeignet ist. Hier habe ich mit XML::Twig gute Erfahrungen gemacht.

Das hier als Anregung:
Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $file = 'test.xml';

my %seen;

my $twig = XML::Twig->new(
    # twig_roots macht aus jedem <Produkt>-Block
    # ein eigenständiges "Objekt"
    # Für jeden Block wird die Methode "produkt" aufgerufen
    twig_roots => {
        Produkt => \&produkt,
    },

    # gib einfach alles außerhalb der Produkt-Blöcke
    # aus.
    twig_print_outside_roots => 1,
)->parsefile( $file );

sub produkt {
  my ($t,$elt) = @_;

  # hole die ProduktNummer
  my ($nr) = $elt->children( 'Produkt_Nummer' );
  my $id   = $nr->text;

  if ( $seen{$id}++ ) {
      # wenn es einen Block für die ProduktNummer bereits
      # gibt, dann lösche den aktuellen Block...
      $elt->delete;
  }
  else {
      # ansonsten gib ihn aus
      $elt->print;
  }

  # gib den Speicher frei
  $t->purge;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread 80 Mio Zeilen einlesen