Thread bitte um Hilfe bei Optimierung eines Skripts (7 answers)
Opened by McSvenster at 2008-11-19 00:38

Linuxer
 2008-11-19 01:46
#116381 #116381
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Ui,

das System muss ja sonst reichlich Langeweile haben, wenn Du ihm sowas antust ;o))
Warum verarbeitest Du die Daten nicht sofort beim ersten Einlesen?
Damit sparst Du Dir das ständige unnütze Einlesen und Durchwandern der Datendatei.

Die substr() kannst Du Dir auch sparen, wenn das Format der Datenbasis sicher ist; dann kannst Du auch mit split() arbeiten:

Code (perl): (dl )
my ( $nummer, $feldname, $inhalt ) = split /s+/, $line, 3;



Hier mal ein grob zusammengezimmerter Vorschlag ohne grosse Testerei:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#! /usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );

my $textfile = '/tmp/massig_text.txt';
my $outputdir = '/tmp';

# eingabedatei lesend oeffnen
open my $fh, '<', $textfile or die "$textfile: $!\n";

# hilfsvariablen fuer die while-schleife
my $vorige_nummer;
my $wh = undef;                                 # schreibhandle

while ( my $line = <$fh> ) {

        # see perldoc perlvar
        local $, = local $\ = "\n";

        # perldoc -f split
        my ( $nummer, $feld, $inhalt ) = split /\s+/, $line, 3;
        chomp $inhalt;

        # sind wir am anfang oder hat $nummer einen neuen Wert?
        if ( not defined $vorige_nummer or $nummer != $vorige_nummer ) {

                # $wh ist definiert, somit muss die ausgabe fuer die 
                # aktuelle datei beendet werden;
                if ( defined $wh ) {

                        print $wh xml_outro();

                        close $wh or die "$outfile: $!\n";

                        # $wh muss undef sein, damit open den skalar wieder nutzen kann
                        # perldoc -f open
                        $wh = undef;
                }

                # Ausgabedatei benennen
                my $outfile = catfile( $outputdir, "$nummer.xml" );

                # eigentlich open my $wh; aber wir betreiben recycling ;)
                open $wh, '>', $outfile or die "$outfile: $!\n";

                # xml intro ausgeben
                print $wh xml_intro( $nummer );
        }

        # aktuelles feld ausgeben
        print $wh xml_field( $feld, $inhalt ) or die "cannot print to output file: $!";

        # nummer merken
        $vorige_nummer = $nummer;
}


# letzte XML Datei abschliessen
if ( defined $wh ) {
        print $wh xml_outro();
        close $wh or die "$outfile: $!\n";
        $wh = undef;
}


close $fh or die "$textfile: $!\n";


sub xml_field {
        my ( $feldname, $inhalt ) = @_;
        return sprintf '<field name="%s">%s</field>', @_;
}

sub xml_intro {
        return sprintf "<add><doc>\n<field name=\"id\">%s</field>", $_[0];
}

sub xml_outro {
        return "</add></doc>";
}

__END__


Edit: XML-Abschluss nach der while Schleife eingefügt
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread bitte um Hilfe bei Optimierung eines Skripts