Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # UN/LOCODES zu gegebener Liste mit Ortsnamen zuordnen
- # Für die Ermittlung der Bezugsorte wird Fuzzy-Suche verwendet (Text::Fuzzy)
- # Das generierte CSV-File wird nachher in ABAP für eine DB-Aktualisierung verwendet
- use open qw(:std :utf8);
- use Text::CSV;
- use Text::Fuzzy;
- my $full_list = "C:\\Temp\\code-list_csv.csv";
- # Volle Liste von UN/LOCODEs
- # Z.B. die code-list.csv via https://datahub.io/core/un-locode
- #CA;YAF;Asbestos Hill
- #CA;ABH;Ashburn
- #CA;YZA;Ashcroft
- #...
- my $gegebene_orte = "C:\\Temp\\zek_incot_orte.csv";
- # Orte, die identifiziert werden müssen:
- # IT;Treviso
- # IN;Tuticorin
- # DE;Tuttlingen
- # ...
- my $ergebnis = "C:\\Temp\\out.csv";
- # Ergebnis dieses Perl-Programms:
- # Format wie $full_list,
- # aber mit den Ortsnamen aus $gegebene_orte
- # ...
- # CH;ABG;Aarberg BE
- # CH;ACL;Aclens VD
- # DE;ALE;Albershausen
- # ...
- # CSV-Parser
- my $csv = Text::CSV->new({ sep_char => ';' });
- my %code = ();
- my %orte = ();
- open LIST, "<$full_list" or die "Can't open $full_list for reading: $!";
- <LIST>; # Kopfzeile überlesen
- foreach my $line (<LIST>) {
- chomp $line;
- if ($csv->parse($line)) {
- my ($land,$code,$ort) = $csv->fields();
- $ort = uc $ort;
- if (not exists $orte{$land}) {
- $orte{$land} = [ $ort ];
- } else {
- push @{$orte{$land}}, $ort;
- }
- $code{$land.$ort} = $code;
- }
- }
- close LIST;
- open ORTE, "<$gegebene_orte" or die "Can't open $gegebene_orte for reading: $!";
- # Ausgabedatei mit BOM explizit als UTF-8 markieren
- open OUT, ">$ergebnis" or die "Can't open $ergebnis for writing: $!";
- print OUT "\x{feff}"; # UTF8-BOM, sonst hat ABAP zuweilen ein Problem, UTF-8 zu erkennen
- # Kopfzeile = Spaltenüberschriften
- print OUT "Land;Ortscode;Ort;Wort-Distanz\n";
- foreach my $line(<ORTE>) {
- chomp $line;
- if ($csv->parse($line)) {
- my ($land,$ort) = $csv->fields();
- my $ORT = uc $ort;
- my $tf = new Text::Fuzzy( $ORT );
- my $nearestv = $tf->nearestv( $orte{$land} );
- if ($nearestv) {
- # Beispiel:
- # CH;ACL;Aclens VD;4
- my $dist = $tf->distance($nearestv);
- $csv->say( *OUT, [ $land,$code{$land.$nearestv},$ort,$dist ] );
- if ($nearestv ne $ORT) {
- printf "%.3d: %s (%s) --> %s\n", $dist, $ort,$land,$nearestv;
- }
- } else {
- printf "Ort $ort in Land $land konnte nicht zugeordnet werden\n";
- }
- }
- }
- close OUT;
- close ORTE;
Add Comment
Please, Sign In to add comment