module PostCodes Counties = [ "ØSTFOLD", "AKERSHUS", "OSLO", "HEDMARK", "OPPLAND", "BUSKERUD", "VESTFOLD", "TELEMARK", "AUST-AGDER", "VEST-AGDER", "ROGALAND", "HORDALAND", "(BERGEN)", "SOGN OG FJORDANE", "MØRE OG ROMSDAL", "SØR-TRØNDELAG", "NORD-TRØNDELAG", "NORDLAND", "TROMS", "FINNMARK", "SVALBARD", "JAN MAYEN", "KONTINENTALSOKKELEN" ] class PostCode attr_reader :postcode, :city, :municipality, :municipality_name, :cat def initialize(postcode, city, muni, muni_name, cat) @postcode, @city, @municipality, @municipality_name, @cat = postcode, city, muni, muni_name, cat end def county code = @municipality[0..1].to_i [code, PostCodes.county(code)] end def >=(postcode) @postcode.to_i >= postcode.to_i end def to_s [@postcode, @city, @municipality, @municipality_name, @cat].join("\t") end end class << self def load(f) @postcodes = [] IO.foreach(f, :encoding => Encoding::ISO_8859_15) do |l| a = l.chomp().split("\t").map{|s| s.encode(Encoding::UTF_8)} @postcodes << PostCode.new(*a) end end def search(pc) @postcodes.bsearch {|x| x >= pc} end def county(c) return nil unless c > 0 && c <= Counties.size Counties[c - 1] end end end