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
|