vola = {} open(ARGV.shift, 'r') { |fp| for line in fp cell = line.sub(/\r?\n$/,'').split(/\t/) id, sub, lat, lon, hp, hha = cell.values_at(5, 6, 8, 9, 10, 12) key = "#{id}/#{sub}" next unless /^\d\d\d\d\d\/[01]$/ === key lon = "#{$1}E" if /^(\d+ \d+)$/ === lon lat = "#{$1}#{$2}" if /^(\d+ \d+) ([NS])$/ === lat raise "lat=#{lat}" unless /^\d+ [0-5]\d*[NS]$/ === lat raise "lon=#{lon}" unless /^\d+ [0-5]\d*[EW]$/ === lon raise "hp=#{hp}" unless /^-?\d*$/ === hp raise "hha=#{hha}" unless /^-?\d*$/ === hha vola[key] = { :lat => lat, :lon => lon, :hp => hp, :hha => hha } end } def sexagesimal(s) d, m, s = s.sub(/[NE]$/, '').sub(/(.*)[WS]$/, "-\\1").split(/ /) (d.to_i * 60 + m.to_i) * 60 + s.to_i end def diffsg(a, b) if b.empty? then '' elsif (sexagesimal(a) - sexagesimal(b)) < 61 then '' else '!' end end def diff(a, b) if b.empty? then '' elsif a == b then '' else '!' end end open(ARGV.shift, 'r') { |fp| for line in fp cell = line.sub(/\r?\n$/,'').split(/\t/) id, stn, lat, lon, hp, hha = cell.values_at(1, 2, 3, 4, 5, 6) next unless /^\d\d\d\d\d$/ === id next if '?' == lat lat = "#{$1}#{$2}" if /^(\d+ \d+) ([NS])$/ === lat lon = "#{$1}#{$2}" if /^(\d+ \d+) ([EW])$/ === lon lon = "#{$1} #{$2}" if /^(\d+) +(\d+[EW])$/ === lon lon = "#{$1} #{$2}" if /^(\d\d\d)(\d\d[EW])$/ === lon $deferr.puts "#{id}:lat=#{lat}" unless /^(\d+ [0-5]\d[NS])?$/ === lat $deferr.puts "#{id}:lon=#{lon}" unless /^(\d+ [0-5]\d[EW])?$/ === lon raise "lat=#{lat}" unless /^(\d+[. ]\d*[NS])?$/ === lat raise "lon=#{lon}" unless /^(\d+[. ]\d*[EW])?$/ === lon row = { :lat => lat, :lon => lon, :hp => hp, :hha => hha } v = (vola["#{id}/1"] || vola["#{id}/0"] || Hash.new("")) next if v == row puts ["'#{id}", stn, diffsg(row[:lat], v[:lat]), row[:lat], v[:lat], diffsg(row[:lon], v[:lon]), row[:lon], v[:lon], diff(row[:hp], v[:hp]), row[:hp], v[:hp], diff(row[:hha], v[:hha]), row[:hha], v[:hha] ].join("\t") end }