aboutsummaryrefslogtreecommitdiffstats
path: root/lib/norwegian-postcodes.rb
blob: 22d67d5755dab571abdbafcb1bcff78e5a715cca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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