8 Einträge, 1 Seite |
Nummer Feldname Feldinhalt
1
2
3
4
5
6
7
8
9
10
11
12
13
000000001 020 irgendetwas
000000001 020 irgendetwas anderes
000000001 021 irgendetwas
000000001 300 irgendetwas
000000001 301 irgendetwas
000000001 301 irgendetwas anderes
000000001 301 irgendetwas XYZ
000000001 650 irgendetwas
000000002 020 irgendetwas
000000002 021 irgendetwas
000000002 100 irgendetwas
000000002 300 irgendetwas
...
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
#!/usr/bin/perl $dumpfile = "pfad_zum_TextFile"; # # 1. Hash mit Systemnummern bilden, damit jede Nummer nur einmal vorkommt. # (Die Anzahl der Vorkommen kann vielleicht spaeter noch genutzt werden.) # open (katalog,"$dumpfile") || die "Der Dump kann nicht geoeffnet werden."; while (defined($Zeile = <katalog>)){ $SysNummern{substr($Zeile,0,9)} = $SysNummern{substr($Zeile,0,9)} +1; } close (katalog); # 2. Hash in Array überführen for $Nummern(sort keys %SysNummern){ push @Systemnummern, $Nummern; } $letzteNummer = $Systemnummern[-1]; # 3. für jede Systemnummer im Array loslegen foreach $Nummer (@Systemnummern){ print "Nummer $Nummer von $letzteNummer\n"; open (karteikarte,">./output/$Nummer.xml") || die "kann xml nicht schreiben - vielleicht kein Verzeichnis output vorhanden?"; print karteikarte "<add><doc>\n"; print karteikarte "<field name=\"id\">$Nummer</field>\n"; open (katalog,"$dumpfile"); while (defined($Zeile = <katalog>)){ if (substr($Zeile,0,9) == $Nummer){ $Feldname = substr($Zeile,10,5); $Feldinhalt = substr($Zeile,21); chomp $Feldinhalt; print karteikarte "<field name=\"$Feldname\">$Feldinhalt</field>\n"; } elsif (substr($Zeile,0,9) > $Nummer){ print karteikarte "</doc></add>\n"; close (karteikarte); last; } } close (katalog); }
my ( $nummer, $feldname, $inhalt ) = split /s+/, $line, 3;
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__
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__
8 Einträge, 1 Seite |