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

McSvenster
 2008-11-19 10:43
#116387 #116387
User since
2008-11-19
12 Artikel
BenutzerIn
[default_avatar]
ah, danke. Aber wenn im zweiten Feld schon Leerzeichen enthalten sind, würde split dort trennen, oder?

Ich habe den Entwurf von Linuxer folgendermassen adaptiert:


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
#! /usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );

my $textfile = 'Test.txt';
my $outputdir = './output';

# 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 = substr($line,0,9);
        my $feld = substr($line,10,5);
        my $inhalt = substr($line,21);
        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"; #outfile noch nicht definiert??
                                                close $wh or die "geht nix\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;
}

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__


Das funktioniert schon sehr gut, bis auf eine Kleinigkeit: Nur im letzten XML- File fehlt das outro . Ich steige noch nicht hinter die Logik.

Viele Grüsse
S.

View full thread bitte um Hilfe bei Optimierung eines Skripts