
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/DStructure/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/DStructure/Address.pm |
package DStructure::Address;
use Data::Dumper;
use Digest::MD5;
use strict;
$Data::Dumper::Sortkeys = 1;
sub new { bless({},$_[0]); }
#*****************************************************************
sub read_csv {
my $self = shift;
my $text = shift;
my @v; my $erg; my $i; my $dataset; my $datafield; my $zeile; my $o;
map { $_ =~ /^(.*?)(\n|$)/s; $v[++$i] = lc($1) } split(/ *[\;\n]+ */s,shift(@$text)); # Spaltenueberschriften lesen
while ($zeile = shift(@$text)) { # Datenzeilen einlesen
$i = 0;
$zeile =~ s/\n//;
foreach $o (split(/\;/,$zeile)) {
if ($o =~ s/^ *(\S)\: *(\S)/$2/) {
$datafield = $1;
} else {
$datafield = $v[++$i];
}
if (exists ($dataset->{$datafield}) ) {
push(@$erg,{%$dataset});
$dataset = {};
}
$dataset->{$datafield} = $o;
}
}
push(@$erg,{%$dataset}) if ($dataset and %$dataset);
return($erg);
}
#*****************************************************************
sub write_csv {
my $self = shift;
my $erg = shift; # Feld mit Eintraegen
my $spalten = shift; # Explizite Spalten
my $felder = shift; # Ordnung weiterer Felder
my $rest = shift || 1; # 1: in EINER Zeile, 2: Zusatzfelder in zweiter Zeile,
# 3: Restfelder auch eigene Zeile, 4: jedes Zusatz- und Restfeld in eigener Zeile
# negativ: auch noch fehlende Rest-Felder anzeigen
my $dataset; my $o; my $allfields; my $datarest; my $felder1; my $sp1; my $sp2; my $bez; my $sum;
$allfields = 1 if ($rest =~ s/\-//);
$spalten = [split(/\,/,$spalten)];
$felder = [split(/\,/,$felder)];
my $text = join("\;",@$spalten) . "\n";
my $trenner = "; ";
$trenner = "\n" if ($rest == 4);
my $sp = {};
foreach $dataset (@$erg) {
map { $sp->{$_} ||= " ___TAB1___" . (sprintf("%09b",1023-length($_))) . "___" } keys %$dataset if ($rest == 4);
$text = $text . "\n";
$text = $text . join("\;", map { $dataset->{$_} } @$spalten);
$datarest = {%$dataset};
$felder1 = [];
map { delete ($datarest->{$_}) if (!($datarest->{$_})) } keys %$datarest;
map { push(@$felder1,$_) if ($datarest->{$_}) } (@$felder);
$text = $text . "\n" if (($rest == 2 or $rest == 3) and @$felder1);
$text = $text . join($trenner, "" , map { "$_: " . $sp->{$_} . $datarest->{$_} } @$felder1);
next if (!$allfields);
map { delete ($datarest->{$_}) } (@$spalten,@$felder);
$text = $text . "\n" if ($rest == 3 and %$datarest or $rest == 2 and !@$felder1);
$text = $text . join($trenner, "" , map { "$_: " . $sp->{$_} . $datarest->{$_} } sort keys %$datarest);
$text = $text . "\n" if ($rest == 4);
}
foreach $sum (1) { # minimale Einrueckung bestimmen
$sp1 = "";
while (0 == 0) {
$sp1 = $sp1 . "0";
next if ($text =~ /___TAB$sum\___$sp1/);
$sp1 = substr($sp1,0,length($sp1)-1) . "1";
last if ($text !~ /___TAB$sum\___$sp1/);
}
$sp1 = eval("0b".substr($sp1,0,length($sp1)-1));
while (0 == 0) { # Spezielle Einrueckungen vornehmen
last if ($text !~ /___TAB$sum\___([01]+)\___/);
$bez = $1;
$sp2 = " " x (eval("0b".$bez) - $sp1);
$text =~ s/___TAB$sum\___$bez\___/$sp2/gs;
}
}
return($text."\n");
}
#********************************************************************************
sub merge {
my $self = shift;
my $nr = shift; # Minimale Anzahl an Uebereinstimmungen, negative Angabe: ueberschreiben
my $erg = shift; # Haupt-Branch
my $erg1 = shift; # hineinzumergende Daten
my $entry; my $entry1; my $o; my $zaehler;
foreach $entry1 (@$erg1) { # Bestimmung des naechsten urspuenglichen Eintrages
$entry1->{'___count___'} = 999999;
foreach $entry (@$erg) {
$zaehler = 0;
foreach $o (keys %$entry1) {
next if (!(exists $entry->{$o}));
next if ($entry->{$o} eq $entry1->{$o});
$zaehler = $zaehler + 1;
}
if ($zaehler < $entry1->{'___count___'}) {
$entry1->{'___count___'} = $zaehler;
$entry1->{'___MERGE___'} = $entry;
}
# print "WWW: $entry1->{'___MERGE___'}->{'name'} $entry1->{'name'} $zaehler\n";
last if (!$zaehler);
}
}
my $replace_field = ($nr =~ s/\-//);
my $insert_count = 0;
foreach $entry1 (@$erg1) {
$entry = $entry1->{'___MERGE___'};
if ($entry1->{'___count___'} < $nr) {
foreach $o (keys $entry1) {
next if ($o eq "___count___");
next if ($o eq "___MERGE___");
$entry->{$o} = "" if ($replace_field or $entry->{$o} eq $entry1->{$o});
$entry->{$o} = $entry->{$o} . "|" if ($entry->{$o});
$entry->{$o} = $entry->{$o} . $entry1->{$o};
}
} else {
++$insert_count;
delete ($entry1->{'___MERGE___'});
push(@$erg,$entry1);
}
}
splice(@$erg,0,99999999, keys map { $_ => 1 } @$erg); # Doubletten loeschen
return($insert_count);
}
1;