From 57f537d8afd5691ec7a8bf2a15dd32251085443d Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sat, 3 Dec 2022 21:13:44 +0100 Subject: xml2json: handle duplicated station names --- share/xml2json | 57 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/share/xml2json b/share/xml2json index c81b416..4591863 100755 --- a/share/xml2json +++ b/share/xml2json @@ -25,11 +25,12 @@ for my $station ( @{$stations} ) { my %station_by_name; for my $station ( @{$stations} ) { - $station_by_name{ $station->{name} } = $station; + push( @{ $station_by_name{ $station->{name} } }, $station ); } -my %xml_by_name; +my %xml_by_ds100; my %xml_by_eva; +my %xml_by_name; my $xml_str = read_file('stations.xml'); my $tree = XML::LibXML->load_xml( string => $xml_str ); @@ -55,8 +56,22 @@ for my $station ( $tree->findnodes('//station') ) { ds100 => $ds100, is_db => $is_db, }; - $xml_by_name{$name} = $xml_station; - $xml_by_eva{$eva} = $xml_station; + $xml_by_ds100{$ds100} = $xml_station; + $xml_by_eva{$eva} = $xml_station; + + if ( exists $xml_by_eva{$name} ) { + push( @{ $xml_by_name{$name}{extra} }, $xml_station ); + } + else { + $xml_by_name{$name} = $xml_station; + } +} + +for my $station ( $tree->findnodes('//station') ) { + my $name = $station->getAttribute('name'); + my $eva = $station->getAttribute('eva'); + my $ds100 = $station->getAttribute('ds100'); + my $is_db = $station->getAttribute('db') eq 'true'; my $found = 0; @@ -80,20 +95,34 @@ for my $station ( $tree->findnodes('//station') ) { ); } elsif ( $station_by_name{$name} - and $station_by_name{$name}{ds100} ne $ds100 - and $is_db - and $ds100 !~ m{ ^ PQ }x ) + and not any { $_->{ds100} eq $ds100 } @{ $station_by_name{$name} } + and $is_db ) { - printf( "%30s has been recoded: %8s -> %8s\n", - $name, $station_by_name{$name}{ds100}, $ds100 ); + printf( "%30s has a new DS100 alias: %8s\n", $name, $ds100 ); + my $station = { + name => $name, + ds100 => $ds100, + eva => $eva, + }; + push( @{$stations}, $station ); + $station_by_eva{$eva} = $station; + $station_by_ds100{$ds100} = $station; + push( @{ $station_by_name{$name} }, $station ); } elsif ( $station_by_name{$name} - and $station_by_name{$name}{eva} ne $eva - and $is_db - and $ds100 !~ m{ ^ PQ }x ) + and not any { $_->{eva} eq $eva } @{ $station_by_name{$name} } + and $is_db ) { - printf( "%30s has been recoded: %d -> %d\n", - $name, $station_by_name{$name}{eva}, $eva ); + printf( "%30s has a new EVA alias: %d\n", $name, $eva ); + my $station = { + name => $name, + ds100 => $ds100, + eva => $eva, + }; + push( @{$stations}, $station ); + $station_by_eva{$eva} = $station; + $station_by_ds100{$ds100} = $station; + push( @{ $station_by_name{$name} }, $station ); } if ( not $found -- cgit v1.2.3