#!/usr/bin/env perl # use LWP::Simple; $ATA100_data_filename = "../raw_data/FAA/ATA-100/current.zip"; use DB_File; main: { #tie %APT,'DB_File',"./apt", O_RDWR, 0644 || die; open(PSV, ">apt.psv") || die; #$pattern = &get_pattern('subscr~2/apt_rf.txt'); #$pattern = &get_pattern('Subscriber File Formats/Apt_rf.txt'); #$pattern = &get_pattern('File Formats/Subscriber File Formats/Apt_rf.txt'); #$pattern = &get_pattern('subscrib/apt_rf.txt'); #$pattern = &get_pattern('formats/apt_rf.txt'); #$pattern = &get_pattern('Formats/Apt_rf.txt'); $pattern = &get_pattern('Subscriber_File_Formats/Apt_rf.txt'); print STDERR "pattern=$pattern\n"; print STDERR "getting airport data...\n"; #&get_airport_data('APT.txt'); #&get_airport_data('apt.txt'); #&get_airport_data('APT.TXT'); #&get_airport_data('APT.txt'); #&get_airport_data('APT.TXT'); &get_airport_data('APT.txt'); dbmclose(%APT); } sub get_pattern { local($path) = @_; my $end = 1; my $count = 0; my $pattern = ''; open(DESC, "unzip -C -p '$ATA100_data_filename' '$path' |") || die; while () { if (/^([LR] .*)$/) { ($just, $type, $length, $start, $element, $desc) = unpack('A2A3A5A7A8A60', $_); printf(STDERR "%d: %s\n", $count, $desc); $field_index{$desc} = $count++; if ($start != $end) { #print PSV "pattern=$pattern\n"; print "pattern=$pattern\n"; last; } $end = $start + $length; $pattern .= sprintf('A%d', $length); } } close(DESC); return($pattern); } sub get_airport_data { local($path) = @_; open(APT, "unzip -C -p '$ATA100_data_filename' '$path' |") || die; while () { chop; $line = $_; #print "callback($line)\n"; @fields = unpack($pattern, $line); next if ($fields[0] ne 'APT'); #print STDERR "$fields[3]\n"; $id = $fields[$field_index{'LOCATION IDENTIFIER'}]; print PSV "$id|"; $data_string = ''; foreach $field ( $field_index{'OFFICIAL FACILITY NAME'}, $field_index{'ASSOCIATED CITY NAME'}, $field_index{'ASSOCIATED STATE POST OFFICE CODE'}, $field_index{'LANDING FACILITY TYPE'}, $field_index{'FACILITY USE'}, ) { print PSV $fields[$field] . '|'; $data_string .= $fields[$field] . '|'; } print PSV &sec_to_deg($fields[24]) . '|'; $data_string .= &sec_to_deg($fields[24]) . '|'; print PSV &sec_to_deg($fields[26]); $data_string .= &sec_to_deg($fields[26]); print PSV "\n"; $APT{$id} = $data_string; } close(APT); } sub sec_to_deg { local($sec) = @_; my $deg; if ($sec =~ /^([0-9\.]+)([NSEW])$/) { $deg = $1 / 3600; $deg *= -1 if ($2 eq 'S'); $deg *= -1 if ($2 eq 'W'); } return($deg); }