Thread bitte um Hilfe bei Optimierung eines Skripts
(7 answers)
Opened by McSvenster at 2008-11-19 00:38
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! |