This is pack.pl in view mode; [Download] [Up]
#!/usr/local/bin/perl eval "exec /usr/local/bin/perl $0 $*" if $running_under_some_shell; # this emulates #! processing on NIH machines. # Perl-Script zur Umstellung alter Postleitzahlen auf neue. # Hilfsprogramm zum Packen der Postdateien und Erzeugen von Indexdateien # ############################################################################# # Copyright (C) 1993 # Andreas Koppenhoefer (koppenh@dia.informatik.uni-stuttgart.de) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ############################################################################# # @(#)$Id: pack.pl,v 1.3 1993/07/01 13:26:25 koppenh Exp $ # $Log: pack.pl,v $ # Revision 1.3 1993/07/01 13:26:25 koppenh # Korrektur fuer Datensaetze die ';' oder ':' enthalten - seithert wurden # sie zerstuemmelt; # # Revision 1.2 1993/06/15 15:38:36 koppenh # Neue Release Nummer; # # Revision 1.1.0.1 1993/06/08 19:12:47 koppenh # fehlendes '$'-Zeichen vor Variablennamen korrigiert; # pofada.index wird jetzt richtig aufgebaut, auch wenn pofada gepackt ist; # ############################################################################# # environment variblen: # Daten werden gelesen von $PLZHOME/../daten und nach $PLZHOME/daten # geschrieben. # $TMPDIR bestimmt ein Verzeichnis, auf dem viel temporaerer Platz # vorhanden ist (> 16 MByte). $homedir = (getpwnam('plz'))[7]; push (@INC, $homedir) if $homedir; $homedir = $ENV{'PLZHOME'} if $ENV{'PLZHOME'} && -d $ENV{'PLZHOME'}; $homedir =~ s,([^/])$,\1/,; # anhaengen von '/' falls nicht schon vorhanden require 'common.pl'; require 'abkuerzung.pl'; require 'umlaut.pl'; $tmpdir = $ENV{'TMPDIR'}; # temp-dir for sort command $tmpdir = '/tmp' if (! $tmpdir || ! -d $tmpdir); $tmpdir =~ s,([^/])$,\1/,; # anhaengen von '/' falls nicht schon vorhanden %pack_extension = ('.Z', 'compress -d -c', '.z', 'gzip -d -c', '.gz', 'gzip -d -c'); select(STDOUT); $| = 1; mkdir ($localprefix, 0755) || die "cannot create local data directory\nmkdir($localprefix): $!" if (! -d $localprefix); # nextfile: foreach $file ($globalprefix.$umsdafile, $globalprefix.$ortardafile, $globalprefix.$stradafile, $globalprefix.$pofadafile, # $globalprefix.$sthnrarfile, $localprefix.'.', $tmpdir.'.') { $file_reader{$file} = "<$file"; next nextfile if (-r $file); if ($file !~ m,/\.$,) { foreach $ext (keys(%pack_extension)) { if (-r $file.$ext) { $file_reader{$file} = "$pack_extension{$ext} $file$ext|"; next nextfile; } } } print "cannot access $file\n"; $error++; } die 'fatal error, aborted' if ($error); # sthnrar - Ich habe noch keine Ahnung, wie ich die Informationen aus dieser # Datei nutzen kann. # print "reading $sthnrarfile:\n"; # open (STHNRAR, "<$globalprefix$sthnrarfile") || die "$!"; # while (<STHNRAR>) { # chop; # print " $.\r" unless $.%200; # y/\r://d; # if (!(($kennz, $plzneu, $geschlneu, $nortname, $nortsteil, # $nstrname, $nhausnr, $nhausnrzus, $geschlalt, $rest) # = m/^(\d)(\d{4})(\d{8})(.{40})(.{30})(.{40})(...)(.)(\d{8})(.*)$/)) { # die "$sthnrarfile line parse error, aborted"; # } # # } # print " $. lines read\n"; if ($system_has_flock && $lockfile) { if (-r $lockfile) { open (LOCKFILE, "<$lockfile") || die "$lockfile: $!\naborted"; die "database files busy (locked), aborted" unless flock (LOCKFILE, &LOCK_EX|&LOCK_NB); unlink ($lockfile) || die "cannot unlink $lockfile: $!\naborted"; print "lockfile '$lockfile' removed.\n"; } else { print "lockfile '$lockfile' not found:\n\tassuming first run.\n"; } } if (-r $globalprefix.$pofadafile) { print "linking $globalprefix$pofadafile\n ->\t$localprefix$pofadafile\n"; unlink ($localprefix.$pofadafile) || die "cannot unlink $localprefix$pofadafile: $!\naborted" if (-r $localprefix.'pofada'); link ($globalprefix.$pofadafile, $localprefix.$pofadafile) || die 'cannot link '. "$globalprefix$pofadafile -> $localprefix$pofadafile: $!\naborted"; } else { print "copying $globalprefix$pofadafile\n ->\t$localprefix$pofadafile\n"; open (POFOUT, ">$localprefix$pofadafile") || die "$!"; $copy_pofada++; } print "creating pofada index:\n"; open (POFADA, $file_reader{$globalprefix.$pofadafile}) || die "$!"; open (PINDEX, ">$localprefix$pofadafile.index") || die "$!"; $lastpos = $last = $ind_count = 0; while (<POFADA>) { next if (($l = length) < 2); print " $.\r" unless $.%500; ($ala, $npanst) = m/^(\d{8})(.{3})/; if ($last ne $ala) { die "pofada: unexpected line order ($lala:$ala),\naborted" if ($last gt $ala); print PINDEX "$ala $lastpos\n"; $ind_count++; $last = $ala; } if ($copy_pofada) { s/\r//; # chop trailing ^M print POFOUT $_; $lastpos = tell(POFOUT); } else { $lastpos = tell(POFADA); } die "tell(pofada): $!" if $lastpos < 0; } print " $ind_count lines index\n"; close PINDEX || die "$!"; close POFADA || die "$!"; close POFOUT || die "$!" if ($copy_pofada); print "packing strada:\n"; open (STRADA, $file_reader{$globalprefix.$stradafile}) || die "$!"; open (SPACK, "| sort -T $tmpdir > $localprefix$stradafile.packed") || die "$!"; while (<STRADA>) { next if (($l = length) < 2); print " $.\r" unless $.%200; y/\r//d; warn "Datensatz enthaelt unerwartete Sonderzeichen - ersetzt durch Leerzeichen\n" if (y/;:/ /); if (!(($alort, $snamesort, $sname, $abkstr, $anzgleist, $nplz_z, $hnrkenn, $hnr1von, $hnr2von, $hnr1bis, $hnr2bis, $plz_z, $rest) = m/^(.{8}).{8}(.{46})..(.{46})(.{23})(\d)(\d)(.)(....)(....)(....)(....)(\d{5})(.*)/)) { die "strada: line parse error, aborted"; } $npanst = substr($rest,61,3); $ortsteil = substr($rest,16,40); $plzalt = substr($rest,56,5); # Ein neues Sortierfeld - das vorgegebene stimmt nicht immer! $sort = &iso2umlaut(&ibm2iso(&ascii2iso($sname))); $sort =~ y/a-z/A-Z/; $sort =~ y/A-Z0-9//dc; $sort =~ s/STRASSE$/STR/; $packed = join(':', $alort, $sort, $sname, $abkstr, $anzgleist, $nplz_z, $hnrkenn, $hnr1von, $hnr2von, $hnr1bis, $hnr2bis, $plz_z, $npanst,$ortsteil,$plzalt); $packed =~ s/ +:/:/g; $packed =~ s/: +/:/g; $packed =~ s/ *$//; # umlaute nach iso umformen $packed = &ibm2iso(&ascii2iso($packed."\n")); $lastpos += length($packed); print SPACK $packed; } print " $. lines read and packed.\n"; close SPACK || die "$!"; close STRADA || die "$!"; print "creating strada index:\n"; open (SPACK, "<$localprefix$stradafile.packed") || die "$!"; open (SINDEX,">$localprefix$stradafile.index") || die "$!"; $lastpos = $ind_count = 0; $lastkey = ''; while (<SPACK>) { chop; s/^(\d{8}):(\w).*/\1\2/; if ($lastkey ne $_) { $lastkey = $_; print SINDEX "$lastkey $lastpos\n"; print " $.\r" unless $ind_count++ % 100; } $lastpos = tell; } print " $ind_count lines index\n"; close SINDEX || die "$!"; close SPACK || die "$!"; print "packing umsda:\n"; open (UMSDA, $file_reader{"$globalprefix$umsdafile"}) || die "$!"; open (UPACK, "| sort -T $tmpdir -t: +1 -2 +0 -1 +2n -3 >$localprefix$umsdafile.packed") || die "$!"; while (<UMSDA>) { y/\r//d; next if (($l = length) < 2); print " $.\r" unless $.%200; die "umsda: line length error ($l), aborted" if ($l != 308 && $l != 303); warn "Datensatz enthaelt unerwartete Sonderzeichen - ersetzt durch Leerzeichen\n" if (y/;:/ /); if (!(($ala, $satzalt, $plz_w_o, $plzalt, $ortname_a, $ortzusa, $oname_sort_a, $geschl, $nplzo_z, $nplzo_p, $npanst_a, $zpanst_a, $nzpanst_a, $alort, $ortname_n, $oname_sort_n, $oname24_n, $nplz_z, $plz_z, $nplz_p, $plz_p) = m/^(.{8})(...)(.)(....)(.{40})(.{30})(.{40})(.{8}).(.)(.)(...)(.{40})(...)(.{8})(.{40})(.{40})(.{24})(.)(.{5})(.)(.*)/)) { die "umsda: line parse error, aborted"; } $plz_p =~ y/[0-9]/[0-9]/cd; # Falls ein Strassenverz. existiert, aber keine Zustell-PLZ zur Postanst. ($nplz_z, $plz_z) = ($nplzo_z, '') if ($nplzo_z > 1 && $nplz_z < 1); # Falls ein Postfachverz. existiert, aber keine Postfach-PLZ zur Postanst. ($nplz_p, $plz_p) = ($nplzo_p, '') if ($nplzo_p > 1 && $nplz_p < 1); # Ortsabkuerzung weglassen, falls identisch $oname24_n = '' if ($oname24_n eq substr($ortname_n, $[, 24)); # ... ebenso neuer Ortsname $ortname_n = '' if ($ortname_n eq $ortname_a); # Ein neues Sortierfeld - das vorgegebene stimmt nicht immer! $sort = &iso2umlaut(&ibm2iso(&ascii2iso($ortname_a))); $sort =~ y/a-z/A-Z/; $sort =~ y/A-Z0-9//dc; # Wortabkuerzungen in Ortszusatz $ortzusa = &abkuerzung($ortzusa); $packed = join(':',($plz_w_o.$plzalt, $sort, $npanst_a, $ortname_a, $ortzusa, $alort, $geschl, $nplz_z, $plz_z, $ortname_n, $nplz_p, $plz_p, $oname24_n)); $packed =~ s/ +:/:/g; $packed =~ s/ +$//; # umlaute nach iso umformen $packed = &ibm2iso(&ascii2iso($packed)); print UPACK $packed."\n"; } print " $. lines read and packed.\n"; close UMSDA || die "$!"; print "packing ortarda, appending to umsda:\n"; open (ORTARDA, $file_reader{"$globalprefix$ortardafile"}) || die "$!"; $bad_lines = 0; while(<ORTARDA>) { print " $.\r" unless $.%200; y/\r//d; warn "Datensatz enthaelt unerwartete Sonderzeichen - ersetzt durch Leerzeichen\n" if (y/;:/ /); if (!(($ala, $plz_w_o, $plzalt, $ortname_a, $ortname_sort_a, $npanst_a, $zpanst_a, $nzpanst_a, $ae_datum, $alort, $ortname_n, $oname_sort_n, $oname24_n, $nplz_z, $plz_z, $nplz_p, $plz_p) = m/^(.{8})...(.)(\d{4})(.{40})(.{40})(...)(.{40})(...)(....)(\d{8})(.{40})(.{40})(.{24})(\d)(.{5})(.)(.*)/)) { warn "ignoring bad line"; die 'too many errors, aborted' if ($bad_lines++ > 32); next; } $plz_p =~ y/[0-9]/[0-9]/cd; # Ein neues Sortierfeld - das vorgegebene stimmt nicht immer! $sort = &iso2umlaut(&ibm2iso(&ascii2iso($ortname_a))); $sort =~ y/a-z/A-Z/; $sort =~ y/A-Z0-9//dc; # Ortsabkuerzung weglassen, falls identisch $oname24_n = '' if ($oname24_n eq substr($ortname_n, $[, 24)); $ortname_n = '' if ($ortname_n eq $ortname_a); $packed = join(':',($plz_w_o.$plzalt, $sort, $npanst_a, $ortname_a, '', $alort, '', $nplz_z, $plz_z, $ortname_n, $nplz_p, $plz_p, $oname24_n)); $packed =~ s/ +:/:/g; $packed =~ s/: +/:/g; $packed =~ s/ *$//; # umlaute nach iso umformen $packed = &ibm2iso(&ascii2iso($packed."\n")); print UPACK $packed; } print " $bad_lines bad lines removed.\n" if ($bad_lines); print " $. lines read and packed.\n"; close ORTARDA || die "$!"; close UPACK || die "$!"; print "creating umsda index:\n"; open (UPACK, "<$localprefix$umsdafile.packed") || die "$!"; open (UPIND, ">$localprefix$umsdafile.index") || die "$!"; $lastpos = 0; $lastkey = ''; $indexline = 0; $lastkey_4 = ''; $index_4 = ''; $lastkey_5 = ''; $index_5 = ''; while (<UPACK>) { $pos = tell; ($plza, $oname_sort_a, $rest) = split (/:/, $_, 3); if ($last ne $oname_sort_a) { die "umsda.packed: unexpected line order ($last-$oname_sort_a),\naborted" if ($last gt $oname_sort_a); $last = $oname_sort_a; } $key = substr($oname_sort_a, 0, 3); $key_4 = substr($oname_sort_a, 0, 4); $key_5 = substr($oname_sort_a, 0, 5); if ($lastkey ne $key) { if ($. > $indexline+500) { print UPIND $index_5; $ind_count += $ind_count_5; } else { if ($. > $indexline+200) { print UPIND $index_4 ; $ind_count += $ind_count_4; } } printf UPIND "%s %d\n", $key, $lastpos; $lastkey = $key; $lastkey_4 = $key_4; $index_4 = ''; $ind_count_4 = 0; $lastkey_5 = $key_5; $index_5 = ''; $ind_count_5 = 0; $indexline = $.; $ind_count++; } else { if ($lastkey_4 ne $key_4) { $lastkey_4 = $key_4; $index_4 .= sprintf("%s %d\n", $key_4, $lastpos); $ind_count_4 ++; } if ($lastkey_5 ne $key_5) { $lastkey_5 = $key_5; $index_5 .= sprintf("%s %d\n", $key_5, $lastpos); $ind_count_5 ++; } } print " $.\r" unless $.%250; $lastpos = $pos; } print " $ind_count lines index.\n"; close UPIND || die "$!"; close UPACK || die "$!"; if ($system_has_flock && ! -r $lockfile) { `touch $lockfile`; print "lockfile created.\n"; } print "finished.\n"; exit(0);
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.